aboutsummaryrefslogtreecommitdiff
path: root/src/gen_mod.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen_mod.erl')
-rw-r--r--src/gen_mod.erl57
1 files changed, 32 insertions, 25 deletions
diff --git a/src/gen_mod.erl b/src/gen_mod.erl
index 768869d52..70d1b0af6 100644
--- a/src/gen_mod.erl
+++ b/src/gen_mod.erl
@@ -11,58 +11,60 @@
-vsn('$Revision$ ').
-export([start/0,
- start_module/2,
- stop_module/1,
+ start_module/3,
+ stop_module/2,
get_opt/2,
get_opt/3,
- get_module_opt/3,
- loaded_modules/0,
- loaded_modules_with_opts/0,
- get_hosts/2]).
+ get_module_opt/4,
+ loaded_modules/1,
+ loaded_modules_with_opts/1,
+ get_hosts/2,
+ get_module_proc/2]).
-export([behaviour_info/1]).
-include("ejabberd.hrl").
--record(ejabberd_module, {module, opts}).
+-record(ejabberd_module, {module_host, opts}).
behaviour_info(callbacks) ->
- [{start, 1},
- {stop, 0}];
+ [{start, 2},
+ {stop, 1}];
behaviour_info(_Other) ->
undefined.
start() ->
ets:new(ejabberd_modules, [named_table,
public,
- {keypos, #ejabberd_module.module}]),
+ {keypos, #ejabberd_module.module_host}]),
ok.
-start_module(Module, Opts) ->
- case catch Module:start(Opts) of
+start_module(Host, Module, Opts) ->
+ case catch Module:start(Host, Opts) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
- ets:insert(ejabberd_modules, #ejabberd_module{module = Module,
- opts = Opts}),
+ ets:insert(ejabberd_modules,
+ #ejabberd_module{module_host = {Module, Host},
+ opts = Opts}),
ok
end.
-stop_module(Module) ->
- case catch Module:stop() of
+stop_module(Host, Module) ->
+ case catch Module:stop(Host) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
{wait, ProcList} when is_list(ProcList) ->
lists:foreach(fun wait_for_process/1, ProcList),
- ets:delete(ejabberd_modules, Module),
+ ets:delete(ejabberd_modules, {Module, Host}),
ok;
{wait, Process} ->
wait_for_process(Process),
- ets:delete(ejabberd_modules, Module),
+ ets:delete(ejabberd_modules, {Module, Host}),
ok;
_ ->
- ets:delete(ejabberd_modules, Module),
+ ets:delete(ejabberd_modules, {Module, Host}),
ok
end.
@@ -104,8 +106,8 @@ get_opt(Opt, Opts, Default) ->
Val
end.
-get_module_opt(Module, Opt, Default) ->
- OptsList = ets:lookup(ejabberd_modules, Module),
+get_module_opt(Host, Module, Opt, Default) ->
+ OptsList = ets:lookup(ejabberd_modules, {Module, Host}),
case OptsList of
[] ->
Default;
@@ -113,15 +115,16 @@ get_module_opt(Module, Opt, Default) ->
get_opt(Opt, Opts, Default)
end.
-loaded_modules() ->
+loaded_modules(Host) ->
ets:select(ejabberd_modules,
- [{#ejabberd_module{_ = '_', module = '$1'},
+ [{#ejabberd_module{_ = '_', module_host = {'$1', Host}},
[],
['$1']}]).
-loaded_modules_with_opts() ->
+loaded_modules_with_opts(Host) ->
ets:select(ejabberd_modules,
- [{#ejabberd_module{_ = '_', module = '$1', opts = '$2'},
+ [{#ejabberd_module{_ = '_', module_host = {'$1', Host},
+ opts = '$2'},
[],
[{{'$1', '$2'}}]}]).
@@ -137,3 +140,7 @@ get_hosts(Opts, Prefix) ->
Hosts ->
Hosts
end.
+
+get_module_proc(Host, Base) ->
+ list_to_atom(atom_to_list(Base) ++ "_" ++ Host).
+