]> granicus.if.org Git - ejabberd/commitdiff
*** empty log message ***
authorAlexey Shchepin <alexey@process-one.net>
Fri, 24 Jan 2003 20:18:33 +0000 (20:18 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Fri, 24 Jan 2003 20:18:33 +0000 (20:18 +0000)
SVN Revision: 49

24 files changed:
doc/guide.html
doc/guide.tex
src/Makefile
src/ejabberd.cfg
src/ejabberd.erl
src/ejabberd.hrl
src/ejabberd_auth.erl
src/ejabberd_c2s.erl
src/ejabberd_config.erl
src/ejabberd_s2s_in.erl
src/ejabberd_s2s_out.erl
src/gen_mod.erl [new file with mode: 0644]
src/jlib.erl
src/mod_configure.erl
src/mod_disco.erl
src/mod_echo.erl
src/mod_offline.erl
src/mod_private.erl
src/mod_register.erl
src/mod_roster.erl
src/mod_stats.erl
src/mod_time.erl
src/mod_vcard.erl
src/mod_version.erl

index a8ff887a895b2421758b39708d8f33c89af90da8..f724f4be3c0d3e76cfdea0096528a10505175e5c 100644 (file)
 <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-->
index 0703acbd56ef615800a61107db3e4e4be309817c..926bc55243c2944ca469068a886c01bd379b8541 100644 (file)
@@ -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}
 
 \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}
index 6bee2bb33b8c5db1dfdb903d06698abe981045a4..08073153e9bdcec21d8244cf0a603dd535968161 100644 (file)
@@ -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
+
index c616cbfb49416bfe2232f79d23daaf07dddaa575..a949a7cf8d3e176eee3bdae72d64700f15836a34 100644 (file)
          ]}.
 
 {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,   []}
           ]}.
 
 
index be9deb6a3c1928e5dde62e1ee5f4b1d7597b0cc3..4a2b34404e46bb29379b1fe04b9469420c840c74 100644 (file)
@@ -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.
 
index 5e453fd5b55b1ced6aa90784691bd49c56624119..c05f766dfa7f417ef1e3edcd5cf4ed5adf6ee6dd 100644 (file)
@@ -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)).
 
 
index 809d3dfd862374f7dbd938f04961b2ce28864fd5..7715a01ff959c16c12259ae29163fc679165b3c2 100644 (file)
         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}          |
index 0f168f32365feadadca883e201e575f09e4c5544..c1f7ebc5d0d95fb080cb6eca6a94aeb0163e992b 100644 (file)
@@ -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}          |
index 40dc97bf2993426c2c4a7aedb73a35571afe833b..51a78592c846b24da6a82c2aeea97dec5354ef86 100644 (file)
@@ -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.
 
index 6f7d020072742519129a74d715c17fe0558a31c6..782788aceac0b183662e7bf155db50637e31f628 100644 (file)
@@ -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}          |
index d83901b1b73ede8a11230d2dfe390d4b698682e5..683cd784d4117570fcd3cb7210bf8ef9c1a69a95 100644 (file)
         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 (file)
index 0000000..6978dbe
--- /dev/null
@@ -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.
+
index 3cf7ed577c33a4f3049592701e48c00155be67da..c15bc06a43fe17a09c2363d896eaa494c4568e86 100644 (file)
@@ -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 ->
index 2567c9963fffd51dcc0a080844573f645eed5cae..405ad470b789c5e9fe4a9ca9dc0a29389190a90a 100644 (file)
@@ -10,6 +10,8 @@
 -author('alexey@sevcom.net').
 -vsn('$Revision$ ').
 
+-behaviour(gen_mod).
+
 -export([start/1,
         process_local_iq/3,
         process_sm_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_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.
 
 
index 141feaf1d2db29dba065ece670c4af30062f9099..56bd4b001de5e0a09703261eb4e1d21d1a6619b4 100644 (file)
@@ -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,
        {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"),
index 06266dd0c08cb952419fddba092fb30c31802158..03a25d25e2e0d1f98481c5d59384a27681ea4e43 100644 (file)
 -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() ->
index 42c8973dd75b9cdacdfa0495af728233d9ffb5b8..f524735a9217039c88e4ae6403720b1f4bf65f6b 100644 (file)
@@ -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},
index 1ed49f3db5d97a6369368347ab3941a95c8c84c9..ef0bc21afcac5692ee2a0bdb0436bef7a3af68c8 100644 (file)
@@ -10,6 +10,8 @@
 -author('alexey@sevcom.net').
 -vsn('$Revision$ ').
 
+-behaviour(gen_mod).
+
 -export([start/1,
         process_local_iq/3]).
 
 
 -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}) ->
index 247b76b71e99c7f688f286118d58f7973e651ba4..811e8f029455fea57a8ba6abbf444778ba712042 100644 (file)
 -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
index 56df1bc4886280e7914887af42378ca0d8f5d5cb..ea8e48a5879a6a4dbc9cde6164b9d75f3f04610b 100644 (file)
@@ -10,7 +10,7 @@
 -author('alexey@sevcom.net').
 -vsn('$Revision$ ').
 
--export([]).
+-behaviour(gen_mod).
 
 -export([start/1,
         process_iq/3,
                 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
index a6f4eb62d3491848fa1ebcde52118447bb347ad4..e0787ce113fcb42819ef535f60a7b0bf0026b3c7 100644 (file)
 -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}) ->
index d2a6459d5763989a1eb10517d8955abeec7d5b5f..7837c83c38c712e2c5e9e7e28d3ac5214c51454b 100644 (file)
@@ -10,6 +10,8 @@
 -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_TIME,
-                                 ?MODULE, process_local_iq, Type).
+                                 ?MODULE, process_local_iq, IQDisc).
 
 
 process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
index f35302e46ace103415f6d8e93c73b777dd88f7c6..cba7ee06ecc1f83135ad633507855fcc752e6d76 100644 (file)
@@ -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() ->
index 73b32b95c825295eaccfbca9827a49ffee601c09..0789c295402b17d69476219ae7bd1f0274854bd2 100644 (file)
@@ -10,6 +10,8 @@
 -author('alexey@sevcom.net').
 -vsn('$Revision$ ').
 
+-behaviour(gen_mod).
+
 -export([start/1,
         process_local_iq/3]).
 
 
 
 
-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).