get_opt/4, get_opt_host/3, opt_type/1, is_equal_opt/5,
get_module_opt/4, get_module_opt/5, get_module_opt_host/3,
loaded_modules/1, loaded_modules_with_opts/1,
- get_hosts/2, get_module_proc/2, is_loaded/2,
+ get_hosts/2, get_module_proc/2, is_loaded/2, is_loaded_elsewhere/2,
start_modules/0, start_modules/1, stop_modules/0, stop_modules/1,
db_mod/2, db_mod/3, ram_db_mod/2, ram_db_mod/3,
db_type/2, db_type/3, ram_db_type/2, ram_db_type/3]).
is_loaded(Host, Module) ->
ets:member(ejabberd_modules, {Module, Host}).
+-spec is_loaded_elsewhere(binary(), atom()) -> boolean().
+is_loaded_elsewhere(Host, Module) ->
+ ets:select_count(
+ ejabberd_modules,
+ ets:fun2ms(
+ fun(#ejabberd_module{module_host = {Mod, H}}) ->
+ (Mod == Module) and (H /= Host)
+ end)) /= 0.
+
-spec config_reloaded() -> ok.
config_reloaded() ->
lists:foreach(
terminate(_Reason, #state{host = Host}) ->
ejabberd_hooks:delete(c2s_auth_result, Host, ?MODULE, c2s_auth_result, 100),
ejabberd_hooks:delete(c2s_stream_started, Host, ?MODULE, c2s_stream_started, 100),
- case is_loaded_at_other_hosts(Host) of
+ case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
true ->
ok;
false ->
none),
acl:match_rule(Host, Access, Addr) == allow.
-is_loaded_at_other_hosts(Host) ->
- lists:any(
- fun(VHost) when VHost == Host ->
- false;
- (VHost) ->
- gen_mod:is_loaded(VHost, ?MODULE)
- end, ?MYHOSTS).
-
seconds_to_now(Secs) ->
{Secs div 1000000, Secs rem 1000000, 0}.
end.
stop(Host) ->
- mod_proxy65_service:delete_listener(Host),
+ case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
+ false ->
+ mod_proxy65_service:delete_listener(Host);
+ true ->
+ ok
+ end,
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
supervisor:delete_child(ejabberd_gen_mod_sup, Proc).