aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/guide.html95
-rw-r--r--doc/guide.tex69
-rw-r--r--src/Makefile6
-rw-r--r--src/ejabberd.cfg20
-rw-r--r--src/ejabberd.erl2
-rw-r--r--src/ejabberd.hrl2
-rw-r--r--src/ejabberd_auth.erl11
-rw-r--r--src/ejabberd_c2s.erl14
-rw-r--r--src/ejabberd_config.erl1
-rw-r--r--src/ejabberd_s2s_in.erl14
-rw-r--r--src/ejabberd_s2s_out.erl42
-rw-r--r--src/gen_mod.erl58
-rw-r--r--src/jlib.erl36
-rw-r--r--src/mod_configure.erl9
-rw-r--r--src/mod_disco.erl21
-rw-r--r--src/mod_echo.erl14
-rw-r--r--src/mod_offline.erl6
-rw-r--r--src/mod_private.erl7
-rw-r--r--src/mod_register.erl11
-rw-r--r--src/mod_roster.erl7
-rw-r--r--src/mod_stats.erl7
-rw-r--r--src/mod_time.erl7
-rw-r--r--src/mod_vcard.erl18
-rw-r--r--src/mod_version.erl7
24 files changed, 354 insertions, 130 deletions
diff --git a/doc/guide.html b/doc/guide.html
index a8ff887a8..f724f4be3 100644
--- a/doc/guide.html
+++ b/doc/guide.html
@@ -18,7 +18,10 @@
<H3 ALIGN=center>Alexey Shchepin<BR><A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR><A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3>
<H3 ALIGN=center>January 23, 2003</H3> <DIV ALIGN=center><IMG SRC="logo.png">
- </DIV>
+
+ </DIV><BR>
+<BR>
+
<BR>
<BR>
@@ -90,9 +93,7 @@ values.<BR>
serves. E.&nbsp;g. to use <TT>jabber.org</TT> domain add following line in config:
<PRE>
{host, "jabber.org"}.
-</PRE>This option is mandatory.<BR>
-<BR>
-<!--TOC subsubsection Listened Sockets-->
+</PRE><!--TOC subsubsection Listened Sockets-->
<H4>3.1.2&nbsp;&nbsp; Listened Sockets</H4><!--SEC END -->
@@ -143,28 +144,30 @@ section&nbsp;<A HREF="#sec:modules">5</A> for detailed information on each modul
Example:
<PRE>
{modules, [
- {mod_register, [one_queue]},
- {mod_roster, [one_queue]},
- {mod_configure, [one_queue]},
- {mod_disco, [one_queue]},
- {mod_stats, [one_queue]},
- {mod_vcard, [one_queue]},
+ {mod_register, []},
+ {mod_roster, []},
+ {mod_configure, []},
+ {mod_disco, []},
+ {mod_stats, []},
+ {mod_vcard, []},
{mod_offline, []},
- {mod_echo, []},
- {mod_private, [one_queue]},
- {mod_time, [one_queue]},
- {mod_version, [one_queue]}
+ {mod_echo, [{host, "echo.e.localhost"}]},
+ {mod_private, []},
+ {mod_time, [{pdisc, no_queue}]},
+ {mod_version, []}
]}.
</PRE><!--TOC subsection Online Configuration-->
<H3>3.2&nbsp;&nbsp; Online Configuration</H3><!--SEC END -->
<A NAME="sec:onlineconfig"></A>To use facility of online reconfiguration of <TT>ejabberd</TT> needed to have
-<TT>mod_configure</TT> loaded (section&nbsp;<A HREF="#sec:modconfigure">5.3</A>). Also highly
-recommended to load <TT>mod_disco</TT> (section&nbsp;<A HREF="#sec:moddisco">5.4</A>), because
+<TT>mod_configure</TT> loaded (see section&nbsp;<A HREF="#sec:modconfigure">5.4</A>). Also highly
+recommended to load <TT>mod_disco</TT> (see section&nbsp;<A HREF="#sec:moddisco">5.5</A>), because
<TT>mod_configure</TT> highly integrates with it. Also recommended to use
disco-capable client.<BR>
<BR>
+TBD<BR>
+<BR>
<!--TOC section Distribution-->
<H2>4&nbsp;&nbsp; Distribution</H2><!--SEC END -->
@@ -173,49 +176,85 @@ disco-capable client.<BR>
<H2>5&nbsp;&nbsp; Built-in Modules</H2><!--SEC END -->
-<A NAME="sec:modules"></A><!--TOC subsection <TT>mod_register</TT>-->
+<A NAME="sec:modules"></A><!--TOC subsection Common Options-->
+
+<H3>5.1&nbsp;&nbsp; Common Options</H3><!--SEC END -->
+
+<A NAME="sec:modcommonopts"></A>Following options used by many modules, so they described in separate section.<BR>
+<BR>
+<!--TOC subsubsection Option <TT>iqdisc</TT>-->
+
+<H4>5.1.1&nbsp;&nbsp; Option <TT>iqdisc</TT></H4><!--SEC END -->
+Many modules define handlers for processing IQ queries of different namespaces
+to this server or to user (e.&nbsp;g. to <TT>myjabber.org</TT> or to
+<TT>user@myjabber.org</TT>). This option defines processing discipline of this
+queries. Possible values are:
+<DL COMPACT=compact>
+<DT>
+<TT>no_queue</TT><DD> All queries of namespace with this processing
+ discipline processed immediately. This also means that no other packets can
+ be processed until finished this. Hence this discipline is not recommended
+ if processing of query can take relative many time.
+
+<DT><TT>one_queue</TT><DD> In this case created separate queue for processing
+ IQ queries of namespace with this discipline, and processing of this queue
+ done in parallel with processing of other packets. This discipline is most
+ recommended.
+
+<DT><TT>parallel</TT><DD> In this case for all packets of namespace with this
+ discipline spawned separate Erlang process, so all this packets processed in
+ parallel. Although spawning of Erlang process have relative low cost, this
+ can broke server normal work, because Erlang have limit of 32000 processes.
+</DL>Example:
+<PRE>
+{modules, [
+ ...
+ {mod_time, [{pdisc, no_queue}]},
+ ...
+ ]}.
+</PRE><!--TOC subsection <TT>mod_register</TT>-->
-<H3>5.1&nbsp;&nbsp; <TT>mod_register</TT></H3><!--SEC END -->
+<H3>5.2&nbsp;&nbsp; <TT>mod_register</TT></H3><!--SEC END -->
<A NAME="sec:modregister"></A><!--TOC subsection <TT>mod_roster</TT>-->
-<H3>5.2&nbsp;&nbsp; <TT>mod_roster</TT></H3><!--SEC END -->
+<H3>5.3&nbsp;&nbsp; <TT>mod_roster</TT></H3><!--SEC END -->
<A NAME="sec:modroster"></A><!--TOC subsection <TT>mod_configure</TT>-->
-<H3>5.3&nbsp;&nbsp; <TT>mod_configure</TT></H3><!--SEC END -->
+<H3>5.4&nbsp;&nbsp; <TT>mod_configure</TT></H3><!--SEC END -->
<A NAME="sec:modconfigure"></A><!--TOC subsection <TT>mod_disco</TT>-->
-<H3>5.4&nbsp;&nbsp; <TT>mod_disco</TT></H3><!--SEC END -->
+<H3>5.5&nbsp;&nbsp; <TT>mod_disco</TT></H3><!--SEC END -->
<A NAME="sec:moddisco"></A><!--TOC subsection <TT>mod_stats</TT>-->
-<H3>5.5&nbsp;&nbsp; <TT>mod_stats</TT></H3><!--SEC END -->
+<H3>5.6&nbsp;&nbsp; <TT>mod_stats</TT></H3><!--SEC END -->
<A NAME="sec:modstats"></A><!--TOC subsection <TT>mod_vcard</TT>-->
-<H3>5.6&nbsp;&nbsp; <TT>mod_vcard</TT></H3><!--SEC END -->
+<H3>5.7&nbsp;&nbsp; <TT>mod_vcard</TT></H3><!--SEC END -->
<A NAME="sec:modvcard"></A><!--TOC subsection <TT>mod_offline</TT>-->
-<H3>5.7&nbsp;&nbsp; <TT>mod_offline</TT></H3><!--SEC END -->
+<H3>5.8&nbsp;&nbsp; <TT>mod_offline</TT></H3><!--SEC END -->
<A NAME="sec:modoffline"></A><!--TOC subsection <TT>mod_echo</TT>-->
-<H3>5.8&nbsp;&nbsp; <TT>mod_echo</TT></H3><!--SEC END -->
+<H3>5.9&nbsp;&nbsp; <TT>mod_echo</TT></H3><!--SEC END -->
<A NAME="sec:modecho"></A><!--TOC subsection <TT>mod_private</TT>-->
-<H3>5.9&nbsp;&nbsp; <TT>mod_private</TT></H3><!--SEC END -->
+<H3>5.10&nbsp;&nbsp; <TT>mod_private</TT></H3><!--SEC END -->
<A NAME="sec:modprivate"></A><!--TOC subsection <TT>mod_time</TT>-->
-<H3>5.10&nbsp;&nbsp; <TT>mod_time</TT></H3><!--SEC END -->
+<H3>5.11&nbsp;&nbsp; <TT>mod_time</TT></H3><!--SEC END -->
<A NAME="sec:modtime"></A><!--TOC subsection <TT>mod_version</TT>-->
-<H3>5.11&nbsp;&nbsp; <TT>mod_version</TT></H3><!--SEC END -->
+<H3>5.12&nbsp;&nbsp; <TT>mod_version</TT></H3><!--SEC END -->
<A NAME="sec:modversion"></A><!--HTMLFOOT-->
<!--ENDHTML-->
diff --git a/doc/guide.tex b/doc/guide.tex
index 0703acbd5..926bc5524 100644
--- a/doc/guide.tex
+++ b/doc/guide.tex
@@ -1,10 +1,13 @@
\documentclass[12pt]{article}
-%\usepackage{graphics}
+\usepackage{graphics}
\usepackage{hevea}
\usepackage{verbatim}
+\newcommand{\imgscale}{0.7}
+
+
\newcommand{\ejabberd}{\texttt{ejabberd}}
\newcommand{\Jabber}{Jabber}
@@ -32,11 +35,12 @@
\begin{titlepage}
\maketitle{}
-
-
- %\includegraphics{logo.png}
{\centering
\imgsrc{logo.png}{}
+ \begin{latexonly}
+ \scalebox{\imgscale}{\includegraphics{logo.png}}
+ \end{latexonly}
+ \par
}
\end{titlepage}
%\newpage
@@ -119,7 +123,7 @@ serves. E.\,g. to use \texttt{jabber.org} domain add following line in config:
{host, "jabber.org"}.
\end{verbatim}
-This option is mandatory.
+%This option is mandatory.
@@ -172,17 +176,17 @@ section~\ref{sec:modules} for detailed information on each module.
Example:
\begin{verbatim}
{modules, [
- {mod_register, [one_queue]},
- {mod_roster, [one_queue]},
- {mod_configure, [one_queue]},
- {mod_disco, [one_queue]},
- {mod_stats, [one_queue]},
- {mod_vcard, [one_queue]},
+ {mod_register, []},
+ {mod_roster, []},
+ {mod_configure, []},
+ {mod_disco, []},
+ {mod_stats, []},
+ {mod_vcard, []},
{mod_offline, []},
- {mod_echo, []},
- {mod_private, [one_queue]},
- {mod_time, [one_queue]},
- {mod_version, [one_queue]}
+ {mod_echo, [{host, "echo.e.localhost"}]},
+ {mod_private, []},
+ {mod_time, [{iqdisc, no_queue}]},
+ {mod_version, []}
]}.
\end{verbatim}
@@ -210,6 +214,41 @@ TBD
+\subsection{Common Options}
+\label{sec:modcommonopts}
+
+Following options used by many modules, so they described in separate section.
+
+
+\subsubsection{Option \texttt{iqdisc}}
+
+Many modules define handlers for processing IQ queries of different namespaces
+to this server or to user (e.\,g. to \texttt{myjabber.org} or to
+\texttt{user@myjabber.org}). This option defines processing discipline of this
+queries. Possible values are:
+\begin{description}
+\item[\texttt{no\_queue}] All queries of namespace with this processing
+ discipline processed immediately. This also means that no other packets can
+ be processed until finished this. Hence this discipline is not recommended
+ if processing of query can take relative many time.
+\item[\texttt{one\_queue}] In this case created separate queue for processing
+ IQ queries of namespace with this discipline, and processing of this queue
+ done in parallel with processing of other packets. This discipline is most
+ recommended.
+\item[\texttt{parallel}] In this case for all packets of namespace with this
+ discipline spawned separate Erlang process, so all this packets processed in
+ parallel. Although spawning of Erlang process have relative low cost, this
+ can broke server normal work, because Erlang have limit of 32000 processes.
+\end{description}
+
+Example:
+\begin{verbatim}
+{modules, [
+ ...
+ {mod_time, [{iqdisc, no_queue}]},
+ ...
+ ]}.
+\end{verbatim}
\subsection{\modregister{}}
\label{sec:modregister}
diff --git a/src/Makefile b/src/Makefile
index 6bee2bb33..08073153e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -8,7 +8,8 @@ LIBDIRS = -L/usr/lib/erlang/lib/erl_interface-3.3.0/lib
ERLSHLIBS = expat_erl.so
all: $(ERLSHLIBS)
- erl -make
+ erl -s make all report -noinput -s erlang halt
+ etags *.erl
$(ERLSHLIBS): %.so: %.c
gcc -Wall $(INCLUDES) $(LIBDIRS) \
@@ -18,3 +19,6 @@ $(ERLSHLIBS): %.so: %.c
-lei \
-o $@ -fpic -shared \
+clean:
+ rm -f *.beam
+
diff --git a/src/ejabberd.cfg b/src/ejabberd.cfg
index c616cbfb4..a949a7cf8 100644
--- a/src/ejabberd.cfg
+++ b/src/ejabberd.cfg
@@ -22,17 +22,17 @@
]}.
{modules, [
- {mod_register, [one_queue]},
- {mod_roster, [one_queue]},
- {mod_configure, [one_queue]},
- {mod_disco, [one_queue]},
- {mod_stats, [one_queue]},
- {mod_vcard, [one_queue]},
+ {mod_register, []},
+ {mod_roster, []},
+ {mod_configure, []},
+ {mod_disco, []},
+ {mod_stats, []},
+ {mod_vcard, []},
{mod_offline, []},
- {mod_echo, []},
- {mod_private, [one_queue]},
- {mod_time, [one_queue]},
- {mod_version, [one_queue]}
+ {mod_echo, [{host, "echo.e.localhost"}]},
+ {mod_private, []},
+ {mod_time, [{iqdisc, no_queue}]},
+ {mod_version, []}
]}.
diff --git a/src/ejabberd.erl b/src/ejabberd.erl
index be9deb6a3..4a2b34404 100644
--- a/src/ejabberd.erl
+++ b/src/ejabberd.erl
@@ -61,7 +61,7 @@ load_modules() ->
ok;
Modules ->
lists:foreach(fun({Module, Args}) ->
- apply(Module, start, Args)
+ gen_mod:start_module(Module, Args)
end, Modules)
end.
diff --git a/src/ejabberd.hrl b/src/ejabberd.hrl
index 5e453fd5b..c05f766df 100644
--- a/src/ejabberd.hrl
+++ b/src/ejabberd.hrl
@@ -19,7 +19,7 @@
-endif.
-define(ERROR_MSG(Format, Args),
- error_logger:format("D(~p:~p:~p) : "++Format++"~n",
+ error_logger:format("E(~p:~p:~p): "++Format++"~n",
[self(),?MODULE,?LINE]++Args)).
diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl
index 809d3dfd8..7715a01ff 100644
--- a/src/ejabberd_auth.erl
+++ b/src/ejabberd_auth.erl
@@ -26,7 +26,12 @@
is_user_exists/1]).
%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]).
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ code_change/3,
+ handle_info/2,
+ terminate/2]).
-record(state, {}).
@@ -78,6 +83,10 @@ handle_call(Request, From, State) ->
handle_cast(Msg, State) ->
{noreply, State}.
+
+code_change(OldVsn, State, Extra) ->
+ {ok, State}.
+
%%----------------------------------------------------------------------
%% Func: handle_info/2
%% Returns: {noreply, State} |
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 0f168f323..c1f7ebc5d 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -20,6 +20,9 @@
% handle_sync_event/4, handle_info/3, terminate/3]).
%
-export([init/1, wait_for_stream/2, wait_for_auth/2, session_established/2,
+ handle_event/3,
+ handle_sync_event/4,
+ code_change/4,
handle_info/3,
terminate/3]).
@@ -88,8 +91,6 @@ init([Socket]) ->
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
-state_name(Event, StateData) ->
- {next_state, state_name, StateData}.
wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) ->
% TODO
@@ -212,9 +213,9 @@ session_established(closed, StateData) ->
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
-state_name(Event, From, StateData) ->
- Reply = ok,
- {reply, Reply, state_name, StateData}.
+%state_name(Event, From, StateData) ->
+% Reply = ok,
+% {reply, Reply, state_name, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_event/3
@@ -238,6 +239,9 @@ handle_sync_event(Event, From, StateName, StateData) ->
Reply = ok,
{reply, Reply, StateName, StateData}.
+code_change(OldVsn, StateName, StateData, Extra) ->
+ {ok, StateName, StateData}.
+
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl
index 40dc97bf2..51a78592c 100644
--- a/src/ejabberd_config.erl
+++ b/src/ejabberd_config.erl
@@ -38,6 +38,7 @@ load_file(File) ->
{ok, Terms} ->
lists:foreach(fun process_term/1, Terms);
{error, Reason} ->
+ ?ERROR_MSG("~p", [Reason]),
exit(file:format_error(Reason))
end.
diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl
index 6f7d02007..782788ace 100644
--- a/src/ejabberd_s2s_in.erl
+++ b/src/ejabberd_s2s_in.erl
@@ -21,6 +21,9 @@
wait_for_key/2,
wait_for_verification/2,
stream_established/2,
+ handle_event/3,
+ handle_sync_event/4,
+ code_change/4,
handle_info/3,
terminate/3]).
@@ -89,8 +92,6 @@ init([Socket]) ->
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
-state_name(Event, StateData) ->
- {next_state, state_name, StateData}.
wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) ->
% TODO
@@ -270,9 +271,9 @@ stream_established(closed, StateData) ->
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
-state_name(Event, From, StateData) ->
- Reply = ok,
- {reply, Reply, state_name, StateData}.
+%state_name(Event, From, StateData) ->
+% Reply = ok,
+% {reply, Reply, state_name, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_event/3
@@ -296,6 +297,9 @@ handle_sync_event(Event, From, StateName, StateData) ->
Reply = ok,
{reply, Reply, StateName, StateData}.
+code_change(OldVsn, StateName, StateData, Extra) ->
+ {ok, StateName, StateData}.
+
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl
index d83901b1b..683cd784d 100644
--- a/src/ejabberd_s2s_out.erl
+++ b/src/ejabberd_s2s_out.erl
@@ -21,8 +21,11 @@
wait_for_stream/2,
wait_for_validation/2,
stream_established/2,
+ handle_event/3,
+ handle_sync_event/4,
handle_info/3,
- terminate/3]).
+ terminate/3,
+ code_change/4]).
-include("ejabberd.hrl").
@@ -268,9 +271,9 @@ stream_established(closed, StateData) ->
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
-state_name(Event, From, StateData) ->
- Reply = ok,
- {reply, Reply, state_name, StateData}.
+%state_name(Event, From, StateData) ->
+% Reply = ok,
+% {reply, Reply, state_name, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_event/3
@@ -294,6 +297,9 @@ handle_sync_event(Event, From, StateName, StateData) ->
Reply = ok,
{reply, Reply, StateName, StateData}.
+code_change(OldVsn, StateName, StateData, Extra) ->
+ {ok, StateName, StateData}.
+
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
@@ -400,20 +406,20 @@ bounce_messages(Reason) ->
ok
end.
-is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
- {key,
- xml:get_attr_s("to", Attrs),
- xml:get_attr_s("from", Attrs),
- xml:get_attr_s("id", Attrs),
- xml:get_cdata(Els)};
-is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:verify" ->
- {verify,
- xml:get_attr_s("to", Attrs),
- xml:get_attr_s("from", Attrs),
- xml:get_attr_s("id", Attrs),
- xml:get_cdata(Els)};
-is_key_packet(_) ->
- false.
+%is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
+% {key,
+% xml:get_attr_s("to", Attrs),
+% xml:get_attr_s("from", Attrs),
+% xml:get_attr_s("id", Attrs),
+% xml:get_cdata(Els)};
+%is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:verify" ->
+% {verify,
+% xml:get_attr_s("to", Attrs),
+% xml:get_attr_s("from", Attrs),
+% xml:get_attr_s("id", Attrs),
+% xml:get_cdata(Els)};
+%is_key_packet(_) ->
+% false.
is_verify_res({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
{result,
diff --git a/src/gen_mod.erl b/src/gen_mod.erl
new file mode 100644
index 000000000..6978dbe37
--- /dev/null
+++ b/src/gen_mod.erl
@@ -0,0 +1,58 @@
+%%%----------------------------------------------------------------------
+%%% File : gen_mod.erl
+%%% Author : Alexey Shchepin <alexey@sevcom.net>
+%%% Purpose :
+%%% Created : 24 Jan 2003 by Alexey Shchepin <alexey@sevcom.net>
+%%% Id : $Id$
+%%%----------------------------------------------------------------------
+
+-module(gen_mod).
+-author('alexey@sevcom.net').
+-vsn('$Revision$ ').
+
+-export([start_module/2,
+ stop_module/1,
+ get_opt/2,
+ get_opt/3]).
+
+-export([behaviour_info/1]).
+
+-include("ejabberd.hrl").
+
+
+behaviour_info(callbacks) ->
+ [{start, 1},
+ {stop, 0}];
+behaviour_info(Other) ->
+ undefined.
+
+
+start_module(Module, Opts) ->
+ case catch Module:start(Opts) of
+ {'EXIT', Reason} ->
+ ?ERROR_MSG("~p", [Reason]);
+ _ ->
+ ok
+ end.
+
+stop_module(Module) ->
+ Module:stop().
+
+
+get_opt(Opt, Opts) ->
+ case lists:keysearch(Opt, 1, Opts) of
+ false ->
+ % TODO: replace with more appropriate function
+ [] = {undefined_option, Opt};
+ {value, {_, Val}} ->
+ Val
+ end.
+
+get_opt(Opt, Opts, Default) ->
+ case lists:keysearch(Opt, 1, Opts) of
+ false ->
+ Default;
+ {value, {_, Val}} ->
+ Val
+ end.
+
diff --git a/src/jlib.erl b/src/jlib.erl
index 3cf7ed577..c15bc06a4 100644
--- a/src/jlib.erl
+++ b/src/jlib.erl
@@ -19,6 +19,7 @@
remove_attr/2,
string_to_jid/1,
jid_to_string/1,
+ is_nodename/1,
tolower/1,
jid_tolower/1,
jid_remove_resource/1,
@@ -133,6 +134,17 @@ string_to_jid1([$/ | J], "") ->
error;
string_to_jid1([$/ | J], N) ->
string_to_jid3(J, "", lists:reverse(N), "");
+string_to_jid1([C | J], N)
+ when (C =< 32) or
+ (C == $") or
+ (C == $&) or
+ (C == $') or
+ (C == $:) or
+ (C == $<) or
+ (C == $>) or
+ (C == 127)
+ ->
+ error;
string_to_jid1([C | J], N) ->
string_to_jid1(J, [C | N]);
string_to_jid1([], "") ->
@@ -173,6 +185,30 @@ jid_to_string({Node, Server, Resource}) ->
S3.
+is_nodename([]) ->
+ false;
+is_nodename(J) ->
+ is_nodename1(J).
+
+is_nodename1([C | J])
+ when (C =< 32) or
+ (C == $") or
+ (C == $&) or
+ (C == $') or
+ (C == $:) or
+ (C == $<) or
+ (C == $>) or
+ (C == $@) or
+ (C == $/) or
+ (C == 127)
+ ->
+ false;
+is_nodename1([C | J]) ->
+ is_nodename1(J);
+is_nodename1([]) ->
+ true.
+
+
% TODO: UNICODE support
tolower_c(C) when C >= $A, C =< $Z ->
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index 2567c9963..405ad470b 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -10,6 +10,8 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1,
process_local_iq/3,
process_sm_iq/3]).
@@ -18,11 +20,12 @@
-include("namespaces.hrl").
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_XDATA,
- ?MODULE, process_local_iq, Type),
+ ?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_XDATA,
- ?MODULE, process_sm_iq, Type),
+ ?MODULE, process_sm_iq, IQDisc),
ok.
diff --git a/src/mod_disco.erl b/src/mod_disco.erl
index 141feaf1d..56bd4b001 100644
--- a/src/mod_disco.erl
+++ b/src/mod_disco.erl
@@ -10,6 +10,8 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1,
process_local_iq_items/3,
process_local_iq_info/3,
@@ -24,23 +26,16 @@
{iq, ID, result, XMLNS, [{xmlelement, "query",
[{"xmlns", ?NS_DISCO_INFO}], []}]}).
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_ITEMS,
- ?MODULE, process_local_iq_items, Type),
+ ?MODULE, process_local_iq_items, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_INFO,
- ?MODULE, process_local_iq_info, Type),
+ ?MODULE, process_local_iq_info, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_ITEMS,
- ?MODULE, process_sm_iq_items, Type),
+ ?MODULE, process_sm_iq_items, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_INFO,
- ?MODULE, process_sm_iq_info, Type),
- %ejabberd_local:register_iq_handler(?NS_DISCO_ITEMS,
- % ?MODULE, process_local_iq_items),
- %ejabberd_local:register_iq_handler(?NS_DISCO_INFO,
- % ?MODULE, process_local_iq_info),
- %ejabberd_sm:register_iq_handler(?NS_DISCO_ITEMS,
- % ?MODULE, process_sm_iq_items),
- %ejabberd_sm:register_iq_handler(?NS_DISCO_INFO,
- % ?MODULE, process_sm_iq_info),
+ ?MODULE, process_sm_iq_info, IQDisc),
register_feature("iq"),
register_feature("presence"),
register_feature("presence-invisible"),
diff --git a/src/mod_echo.erl b/src/mod_echo.erl
index 06266dd0c..03a25d25e 100644
--- a/src/mod_echo.erl
+++ b/src/mod_echo.erl
@@ -10,18 +10,22 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/0, init/0]).
+-behaviour(gen_mod).
+
+-export([start/1, init/1]).
-include("ejabberd.hrl").
-include("namespaces.hrl").
-start() ->
- spawn(?MODULE, init, []).
+start(Opts) ->
+ %Host = gen_mod:get_opt(host, Opts),
+ Host = gen_mod:get_opt(host, Opts, "echo." ++ ?MYNAME),
+ spawn(?MODULE, init, [Host]).
-init() ->
- ejabberd_router:register_local_route("echo." ++ ?MYNAME),
+init(Host) ->
+ ejabberd_router:register_local_route(Host),
loop().
loop() ->
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index 42c8973dd..f524735a9 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -9,7 +9,9 @@
-module(mod_offline).
-author('alexey@sevcom.net').
--export([start/0,
+-behaviour(gen_mod).
+
+-export([start/1,
store_packet/3,
resend_offline_messages/1]).
@@ -18,7 +20,7 @@
-record(offline_msg, {user, timestamp, from, to, packet}).
-start() ->
+start(_) ->
mnesia:create_table(offline_msg,
[{disc_only_copies, [node()]},
{type, bag},
diff --git a/src/mod_private.erl b/src/mod_private.erl
index 1ed49f3db..ef0bc21af 100644
--- a/src/mod_private.erl
+++ b/src/mod_private.erl
@@ -10,6 +10,8 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1,
process_local_iq/3]).
@@ -18,12 +20,13 @@
-record(private_storage, {userns, xml}).
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mnesia:create_table(private_storage,
[{disc_only_copies, [node()]},
{attributes, record_info(fields, private_storage)}]),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_PRIVATE,
- ?MODULE, process_local_iq, Type).
+ ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
diff --git a/src/mod_register.erl b/src/mod_register.erl
index 247b76b71..811e8f029 100644
--- a/src/mod_register.erl
+++ b/src/mod_register.erl
@@ -10,14 +10,17 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1, init/0, process_iq/3]).
-include("ejabberd.hrl").
-include("namespaces.hrl").
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_REGISTER,
- ?MODULE, process_iq, Type),
+ ?MODULE, process_iq, IQDisc),
ok.
init() ->
@@ -71,8 +74,8 @@ process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
try_register(User, Password) ->
- case jlib:string_to_jid(User ++ "@" ++ "x") of
- error ->
+ case jlib:is_nodename(User) of
+ false ->
{error, "406", "Not Acceptable"};
_ ->
case ejabberd_auth:try_register(User, Password) of
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index 56df1bc48..ea8e48a58 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -10,7 +10,7 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([]).
+-behaviour(gen_mod).
-export([start/1,
process_iq/3,
@@ -33,12 +33,13 @@
xattrs = [],
xs = []}).
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mnesia:create_table(roster,[{disc_copies, [node()]},
{attributes, record_info(fields, roster)}]),
mnesia:add_table_index(roster, user),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_ROSTER,
- ?MODULE, process_local_iq, Type).
+ ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, _, Type, _, _} = IQ) ->
case Type of
diff --git a/src/mod_stats.erl b/src/mod_stats.erl
index a6f4eb62d..e0787ce11 100644
--- a/src/mod_stats.erl
+++ b/src/mod_stats.erl
@@ -10,14 +10,17 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1,
process_local_iq/3]).
-include("namespaces.hrl").
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_STATS,
- ?MODULE, process_local_iq, Type).
+ ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
diff --git a/src/mod_time.erl b/src/mod_time.erl
index d2a6459d5..7837c83c3 100644
--- a/src/mod_time.erl
+++ b/src/mod_time.erl
@@ -10,6 +10,8 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1,
process_local_iq/3]).
@@ -17,9 +19,10 @@
-include("namespaces.hrl").
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_TIME,
- ?MODULE, process_local_iq, Type).
+ ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl
index f35302e46..cba7ee06e 100644
--- a/src/mod_vcard.erl
+++ b/src/mod_vcard.erl
@@ -10,7 +10,9 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
--export([start/1, init/0,
+-behaviour(gen_mod).
+
+-export([start/1, init/1,
process_local_iq/3,
process_sm_iq/3,
reindex_vcards/0]).
@@ -35,7 +37,7 @@
-record(vcard, {user, vcard}).
-start(Type) ->
+start(Opts) ->
mnesia:create_table(vcard, [{disc_only_copies, [node()]},
{attributes, record_info(fields, vcard)}]),
mnesia:create_table(vcard_search,
@@ -53,15 +55,17 @@ start(Type) ->
mnesia:add_table_index(vcard_search, lorgname),
mnesia:add_table_index(vcard_search, lorgunit),
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VCARD,
- ?MODULE, process_local_iq, Type),
+ ?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_VCARD,
- ?MODULE, process_sm_iq, Type),
- spawn(?MODULE, init, []).
+ ?MODULE, process_sm_iq, IQDisc),
+ Host = gen_mod:get_opt(host, Opts, "vjud." ++ ?MYNAME),
+ spawn(?MODULE, init, [Host]).
-init() ->
- ejabberd_router:register_local_route("vjud." ++ ?MYNAME),
+init(Host) ->
+ ejabberd_router:register_local_route(Host),
loop().
loop() ->
diff --git a/src/mod_version.erl b/src/mod_version.erl
index 73b32b95c..0789c2954 100644
--- a/src/mod_version.erl
+++ b/src/mod_version.erl
@@ -10,6 +10,8 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
+-behaviour(gen_mod).
+
-export([start/1,
process_local_iq/3]).
@@ -18,9 +20,10 @@
-start(Type) ->
+start(Opts) ->
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VERSION,
- ?MODULE, process_local_iq, Type).
+ ?MODULE, process_local_iq, IQDisc).