summaryrefslogtreecommitdiff
path: root/src/mod_disco.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-02-22 19:46:47 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-02-22 19:46:47 +0300
commit3c4057ff553928d4e4ab40e410dbc6a478dd8206 (patch)
treea0272f84a1221db928cfd4c9f44d9bed6e196bc8 /src/mod_disco.erl
parentMake sure all hooks are called with proper host (diff)
Reload modules when reloading configuration file
Diffstat (limited to 'src/mod_disco.erl')
-rw-r--r--src/mod_disco.erl43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/mod_disco.erl b/src/mod_disco.erl
index 2de8679e..88c06c54 100644
--- a/src/mod_disco.erl
+++ b/src/mod_disco.erl
@@ -32,7 +32,7 @@
-behaviour(gen_mod).
--export([start/2, stop/1, process_local_iq_items/1,
+-export([start/2, stop/1, reload/3, process_local_iq_items/1,
process_local_iq_info/1, get_local_identity/5,
get_local_features/5, get_local_services/5,
process_sm_iq_items/1, process_sm_iq_info/1,
@@ -118,10 +118,51 @@ stop(Host) ->
{{'_', Host}}),
ok.
+reload(Host, NewOpts, OldOpts) ->
+ case gen_mod:is_equal_opt(extra_domains, NewOpts, OldOpts,
+ fun(Hs) ->
+ [iolist_to_binary(H) || H <- Hs]
+ end, []) of
+ {false, NewDomains, OldDomains} ->
+ lists:foreach(
+ fun(Domain) ->
+ register_extra_domain(Host, Domain)
+ end, NewDomains -- OldDomains),
+ lists:foreach(
+ fun(Domain) ->
+ unregister_extra_domain(Host, Domain)
+ end, OldDomains -- NewDomains);
+ true ->
+ ok
+ end,
+ case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts,
+ fun gen_iq_handler:check_type/1,
+ one_queue) of
+ {false, IQDisc, _} ->
+ gen_iq_handler:add_iq_handler(ejabberd_local, Host,
+ ?NS_DISCO_ITEMS, ?MODULE,
+ process_local_iq_items, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_local, Host,
+ ?NS_DISCO_INFO, ?MODULE,
+ process_local_iq_info, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
+ ?NS_DISCO_ITEMS, ?MODULE, process_sm_iq_items,
+ IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
+ ?NS_DISCO_INFO, ?MODULE, process_sm_iq_info,
+ IQDisc);
+ true ->
+ ok
+ end.
+
-spec register_extra_domain(binary(), binary()) -> true.
register_extra_domain(Host, Domain) ->
ets:insert(disco_extra_domains, {{Domain, Host}}).
+-spec unregister_extra_domain(binary(), binary()) -> true.
+unregister_extra_domain(Host, Domain) ->
+ ets:delete_object(disco_extra_domains, {{Domain, Host}}).
+
-spec process_local_iq_items(iq()) -> iq().
process_local_iq_items(#iq{type = set, lang = Lang} = IQ) ->
Txt = <<"Value 'set' of 'type' attribute is not allowed">>,