diff --git a/ChangeLog b/ChangeLog index 69a3e3e7e..d6946fc8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-07-30 Badlop + + * src/gen_mod.erl: When ejabberd is kindly stopped, don't forget + modules configuration (EJAB-706) + * src/ejabberd_app.erl: Likewise + 2008-07-28 Badlop * doc/guide.tex: Document how to get error message when ejabberd diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 8f335ad5b..f1e4413a1 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -152,7 +152,7 @@ stop_modules() -> Modules -> lists:foreach( fun({Module, _Args}) -> - gen_mod:stop_module(Host, Module) + gen_mod:stop_module_keep_config(Host, Module) end, Modules) end end, ?MYHOSTS). diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 29fbb1104..4333729ee 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -72,22 +72,34 @@ start_module(Host, Module, Opts) -> ok end. +%% @doc Stop the module in a host, and forget its configuration. stop_module(Host, Module) -> + case stop_module_keep_config(Host, Module) of + error -> + error; + ok -> + del_module_mnesia(Host, Module) + end. + +%% @doc Stop the module in a host, but keep its configuration. +%% As the module configuration is kept in the Mnesia local_config table, +%% when ejabberd is restarted the module will be started again. +%% This function is useful when ejabberd is being stopped +%% and it stops all modules. +stop_module_keep_config(Host, Module) -> case catch Module:stop(Host) of {'EXIT', Reason} -> - ?ERROR_MSG("~p", [Reason]); + ?ERROR_MSG("~p", [Reason]), + error; {wait, ProcList} when is_list(ProcList) -> lists:foreach(fun wait_for_process/1, ProcList), - del_module_mnesia(Host, Module), ets:delete(ejabberd_modules, {Module, Host}), ok; {wait, Process} -> wait_for_process(Process), - del_module_mnesia(Host, Module), ets:delete(ejabberd_modules, {Module, Host}), ok; _ -> - del_module_mnesia(Host, Module), ets:delete(ejabberd_modules, {Module, Host}), ok end.