From e1ba499bd65ce4b5f9d93b8e2a543d14dee73962 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 13 Feb 2017 11:11:41 +0300 Subject: [PATCH] Check result of gen_mod:start/2 callback (#1534) --- src/ejabberd_local.erl | 25 +++++++------------------ src/ejabberd_sm.erl | 20 ++++++-------------- src/gen_iq_handler.erl | 4 ++-- src/gen_mod.erl | 17 +++++++++++------ src/mod_announce.erl | 5 +++-- src/mod_bosh.erl | 6 +++--- src/mod_proxy65.erl | 20 +++++++++----------- src/mod_vcard.erl | 5 +++-- 8 files changed, 44 insertions(+), 58 deletions(-) diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index 07b6f66db..f80d97249 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -33,7 +33,7 @@ -export([start/0, start_link/0]). -export([route/3, route_iq/4, route_iq/5, process_iq/3, - process_iq_reply/3, register_iq_handler/4, get_features/1, + process_iq_reply/3, get_features/1, register_iq_handler/5, register_iq_response_handler/4, register_iq_response_handler/5, unregister_iq_handler/2, unregister_iq_response_handler/2, bounce_resource_packet/3]). @@ -83,9 +83,6 @@ process_iq(From, To, #iq{type = T, lang = Lang, sub_els = [El]} = Packet) XMLNS = xmpp:get_ns(El), Host = To#jid.lserver, case ets:lookup(?IQTABLE, {Host, XMLNS}) of - [{_, Module, Function}] -> - gen_iq_handler:handle(Host, Module, Function, no_queue, - From, To, Packet); [{_, Module, Function, Opts}] -> gen_iq_handler:handle(Host, Module, Function, Opts, From, To, Packet); @@ -161,24 +158,21 @@ register_iq_response_handler(_Host, ID, Module, function = Function, timer = TRef}). --spec register_iq_handler(binary(), binary(), module(), function()) -> any(). -register_iq_handler(Host, XMLNS, Module, Fun) -> - ejabberd_local ! - {register_iq_handler, Host, XMLNS, Module, Fun}. - -spec register_iq_handler(binary(), binary(), module(), function(), - gen_iq_handler:opts()) -> any(). + gen_iq_handler:opts()) -> ok. register_iq_handler(Host, XMLNS, Module, Fun, Opts) -> ejabberd_local ! - {register_iq_handler, Host, XMLNS, Module, Fun, Opts}. + {register_iq_handler, Host, XMLNS, Module, Fun, Opts}, + ok. -spec unregister_iq_response_handler(binary(), binary()) -> ok. unregister_iq_response_handler(_Host, ID) -> catch get_iq_callback(ID), ok. --spec unregister_iq_handler(binary(), binary()) -> any(). +-spec unregister_iq_handler(binary(), binary()) -> ok. unregister_iq_handler(Host, XMLNS) -> - ejabberd_local ! {unregister_iq_handler, Host, XMLNS}. + ejabberd_local ! {unregister_iq_handler, Host, XMLNS}, + ok. -spec bounce_resource_packet(jid(), jid(), stanza()) -> stop. bounce_resource_packet(_From, #jid{lresource = <<"">>}, #presence{}) -> @@ -238,11 +232,6 @@ handle_info({route, From, To, Packet}, State) -> _ -> ok end, {noreply, State}; -handle_info({register_iq_handler, Host, XMLNS, Module, - Function}, - State) -> - ets:insert(?IQTABLE, {{Host, XMLNS}, Module, Function}), - {noreply, State}; handle_info({register_iq_handler, Host, XMLNS, Module, Function, Opts}, State) -> diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 2c2f0a9f5..62f250d57 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -55,7 +55,6 @@ get_vh_session_list/1, get_vh_session_number/1, get_vh_by_backend/1, - register_iq_handler/4, register_iq_handler/5, unregister_iq_handler/2, force_update_presence/1, @@ -356,18 +355,17 @@ get_vh_session_number(Server) -> Mod = get_sm_backend(LServer), length(online(Mod:get_sessions(LServer))). -register_iq_handler(Host, XMLNS, Module, Fun) -> - ejabberd_sm ! {register_iq_handler, Host, XMLNS, Module, Fun}. - --spec register_iq_handler(binary(), binary(), atom(), atom(), list()) -> any(). +-spec register_iq_handler(binary(), binary(), atom(), atom(), list()) -> ok. register_iq_handler(Host, XMLNS, Module, Fun, Opts) -> - ejabberd_sm ! {register_iq_handler, Host, XMLNS, Module, Fun, Opts}. + ejabberd_sm ! {register_iq_handler, Host, XMLNS, Module, Fun, Opts}, + ok. --spec unregister_iq_handler(binary(), binary()) -> any(). +-spec unregister_iq_handler(binary(), binary()) -> ok. unregister_iq_handler(Host, XMLNS) -> - ejabberd_sm ! {unregister_iq_handler, Host, XMLNS}. + ejabberd_sm ! {unregister_iq_handler, Host, XMLNS}, + ok. %% Why the hell do we have so many similar kicks? c2s_handle_info(#{lang := Lang} = State, replaced) -> @@ -421,9 +419,6 @@ handle_info({route, From, To, Packet}, State) -> ok end, {noreply, State}; -handle_info({register_iq_handler, Host, XMLNS, Module, Function}, State) -> - ets:insert(sm_iqtable, {{Host, XMLNS}, Module, Function}), - {noreply, State}; handle_info({register_iq_handler, Host, XMLNS, Module, Function, Opts}, State) -> @@ -744,9 +739,6 @@ process_iq(From, To, #iq{type = T, lang = Lang, sub_els = [El]} = Packet) XMLNS = xmpp:get_ns(El), Host = To#jid.lserver, case ets:lookup(sm_iqtable, {Host, XMLNS}) of - [{_, Module, Function}] -> - gen_iq_handler:handle(Host, Module, Function, no_queue, - From, To, Packet); [{_, Module, Function, Opts}] -> gen_iq_handler:handle(Host, Module, Function, Opts, From, To, Packet); diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl index 74c6f4da0..fedd72c49 100644 --- a/src/gen_iq_handler.erl +++ b/src/gen_iq_handler.erl @@ -60,7 +60,7 @@ start_link(Host, Module, Function) -> gen_server:start_link(?MODULE, [Host, Module, Function], []). --spec add_iq_handler(module(), binary(), binary(), module(), atom(), type()) -> any(). +-spec add_iq_handler(module(), binary(), binary(), module(), atom(), type()) -> ok. add_iq_handler(Component, Host, NS, Module, Function, Type) -> @@ -89,7 +89,7 @@ add_iq_handler(Component, Host, NS, Module, Function, Function, parallel) end. --spec remove_iq_handler(component(), binary(), binary()) -> any(). +-spec remove_iq_handler(component(), binary(), binary()) -> ok. remove_iq_handler(Component, Host, NS) -> Component:unregister_iq_handler(Host, NS). diff --git a/src/gen_mod.erl b/src/gen_mod.erl index c77726ef1..872ae8589 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -51,7 +51,7 @@ -type opts() :: [{atom(), any()}]. -type db_type() :: sql | mnesia | riak. --callback start(binary(), opts()) -> any(). +-callback start(binary(), opts()) -> ok | {ok, pid()}. -callback stop(binary()) -> any(). -callback mod_opt_type(atom()) -> fun((term()) -> term()) | [atom()]. -callback depends(binary(), opts()) -> [{module(), hard | soft}]. @@ -145,19 +145,24 @@ start_module(Host, Module) -> {error, not_found_in_config} end. --spec start_module(binary(), atom(), opts()) -> any(). +-spec start_module(binary(), atom(), opts()) -> ok | {ok, pid()}. start_module(Host, Module, Opts0) -> + ?DEBUG("loading ~s at ~s", [Module, Host]), Opts = validate_opts(Module, Opts0), ets:insert(ejabberd_modules, #ejabberd_module{module_host = {Module, Host}, opts = Opts}), - try Module:start(Host, Opts) catch - Class:Reason -> + try case Module:start(Host, Opts) of + ok -> ok; + {ok, Pid} when is_pid(Pid) -> {ok, Pid}; + Err -> erlang:error(Err) + end + catch Class:Reason -> ets:delete(ejabberd_modules, {Module, Host}), ErrorText = - io_lib:format("Problem starting the module ~p for host " - "~p ~n options: ~p~n ~p: ~p~n~p", + io_lib:format("Problem starting the module ~s for host " + "~s ~n options: ~p~n ~p: ~p~n~p", [Module, Host, Opts, Class, Reason, erlang:get_stacktrace()]), ?CRITICAL_MSG(ErrorText, []), diff --git a/src/mod_announce.erl b/src/mod_announce.erl index d4740fa5f..e8c71f31d 100644 --- a/src/mod_announce.erl +++ b/src/mod_announce.erl @@ -70,8 +70,9 @@ start(Host, Opts) -> ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, announce_commands, 50), ejabberd_hooks:add(c2s_self_presence, Host, ?MODULE, send_motd, 50), - register(gen_mod:get_module_proc(Host, ?PROCNAME), - proc_lib:spawn(?MODULE, init, [])). + Pid = proc_lib:spawn(?MODULE, init, []), + register(gen_mod:get_module_proc(Host, ?PROCNAME), Pid), + {ok, Pid}. depends(_Host, _Opts) -> [{mod_adhoc, hard}]. diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index 62dc31ac8..92ce6bc10 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -90,13 +90,13 @@ find_session(SID) -> start(Host, Opts) -> start_jiffy(Opts), + Mod = gen_mod:ram_db_mod(global, ?MODULE), + Mod:init(), TmpSup = gen_mod:get_module_proc(Host, ?PROCNAME), TmpSupSpec = {TmpSup, {ejabberd_tmp_sup, start_link, [TmpSup, ejabberd_bosh]}, permanent, infinity, supervisor, [ejabberd_tmp_sup]}, - supervisor:start_child(ejabberd_sup, TmpSupSpec), - Mod = gen_mod:ram_db_mod(global, ?MODULE), - Mod:init(). + supervisor:start_child(ejabberd_sup, TmpSupSpec). stop(Host) -> TmpSup = gen_mod:get_module_proc(Host, ?PROCNAME), diff --git a/src/mod_proxy65.erl b/src/mod_proxy65.erl index 8486802d0..4bb754d84 100644 --- a/src/mod_proxy65.erl +++ b/src/mod_proxy65.erl @@ -51,17 +51,15 @@ start(Host, Opts) -> case mod_proxy65_service:add_listener(Host, Opts) of - {error, _} = Err -> erlang:error(Err); - _ -> - Proc = gen_mod:get_module_proc(Host, ?PROCNAME), - ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]}, - transient, infinity, supervisor, [?MODULE]}, - case supervisor:start_child(ejabberd_sup, ChildSpec) of - {error, _} = Err -> erlang:error(Err); - _ -> - Mod = gen_mod:ram_db_mod(global, ?MODULE), - Mod:init() - end + {error, _} = Err -> + Err; + _ -> + Mod = gen_mod:ram_db_mod(global, ?MODULE), + Mod:init(), + Proc = gen_mod:get_module_proc(Host, ?PROCNAME), + ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]}, + transient, infinity, supervisor, [?MODULE]}, + supervisor:start_child(ejabberd_sup, ChildSpec) end. stop(Host) -> diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 7dd6d251d..66e239280 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -98,8 +98,9 @@ start(Host, Opts) -> true -> ok end, - register(gen_mod:get_module_proc(Host, ?PROCNAME), - spawn(?MODULE, init, [MyHost, Host, Search])). + Pid = spawn(?MODULE, init, [MyHost, Host, Search]), + register(gen_mod:get_module_proc(Host, ?PROCNAME), Pid), + {ok, Pid}. init(Host, ServerHost, Search) -> case Search of