mirror of
https://github.com/processone/ejabberd.git
synced 2024-09-27 14:30:55 +02:00
Check result of gen_mod:start/2 callback (#1534)
This commit is contained in:
parent
fd885d0818
commit
e1ba499bd6
@ -33,7 +33,7 @@
|
|||||||
-export([start/0, start_link/0]).
|
-export([start/0, start_link/0]).
|
||||||
|
|
||||||
-export([route/3, route_iq/4, route_iq/5, process_iq/3,
|
-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_handler/5, register_iq_response_handler/4,
|
||||||
register_iq_response_handler/5, unregister_iq_handler/2,
|
register_iq_response_handler/5, unregister_iq_handler/2,
|
||||||
unregister_iq_response_handler/2, bounce_resource_packet/3]).
|
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),
|
XMLNS = xmpp:get_ns(El),
|
||||||
Host = To#jid.lserver,
|
Host = To#jid.lserver,
|
||||||
case ets:lookup(?IQTABLE, {Host, XMLNS}) of
|
case ets:lookup(?IQTABLE, {Host, XMLNS}) of
|
||||||
[{_, Module, Function}] ->
|
|
||||||
gen_iq_handler:handle(Host, Module, Function, no_queue,
|
|
||||||
From, To, Packet);
|
|
||||||
[{_, Module, Function, Opts}] ->
|
[{_, Module, Function, Opts}] ->
|
||||||
gen_iq_handler:handle(Host, Module, Function, Opts,
|
gen_iq_handler:handle(Host, Module, Function, Opts,
|
||||||
From, To, Packet);
|
From, To, Packet);
|
||||||
@ -161,24 +158,21 @@ register_iq_response_handler(_Host, ID, Module,
|
|||||||
function = Function,
|
function = Function,
|
||||||
timer = TRef}).
|
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(),
|
-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) ->
|
register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
|
||||||
ejabberd_local !
|
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.
|
-spec unregister_iq_response_handler(binary(), binary()) -> ok.
|
||||||
unregister_iq_response_handler(_Host, ID) ->
|
unregister_iq_response_handler(_Host, ID) ->
|
||||||
catch get_iq_callback(ID), ok.
|
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) ->
|
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.
|
-spec bounce_resource_packet(jid(), jid(), stanza()) -> stop.
|
||||||
bounce_resource_packet(_From, #jid{lresource = <<"">>}, #presence{}) ->
|
bounce_resource_packet(_From, #jid{lresource = <<"">>}, #presence{}) ->
|
||||||
@ -238,11 +232,6 @@ handle_info({route, From, To, Packet}, State) ->
|
|||||||
_ -> ok
|
_ -> ok
|
||||||
end,
|
end,
|
||||||
{noreply, State};
|
{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,
|
handle_info({register_iq_handler, Host, XMLNS, Module,
|
||||||
Function, Opts},
|
Function, Opts},
|
||||||
State) ->
|
State) ->
|
||||||
|
@ -55,7 +55,6 @@
|
|||||||
get_vh_session_list/1,
|
get_vh_session_list/1,
|
||||||
get_vh_session_number/1,
|
get_vh_session_number/1,
|
||||||
get_vh_by_backend/1,
|
get_vh_by_backend/1,
|
||||||
register_iq_handler/4,
|
|
||||||
register_iq_handler/5,
|
register_iq_handler/5,
|
||||||
unregister_iq_handler/2,
|
unregister_iq_handler/2,
|
||||||
force_update_presence/1,
|
force_update_presence/1,
|
||||||
@ -356,18 +355,17 @@ get_vh_session_number(Server) ->
|
|||||||
Mod = get_sm_backend(LServer),
|
Mod = get_sm_backend(LServer),
|
||||||
length(online(Mod:get_sessions(LServer))).
|
length(online(Mod:get_sessions(LServer))).
|
||||||
|
|
||||||
register_iq_handler(Host, XMLNS, Module, Fun) ->
|
-spec register_iq_handler(binary(), binary(), atom(), atom(), list()) -> ok.
|
||||||
ejabberd_sm ! {register_iq_handler, Host, XMLNS, Module, Fun}.
|
|
||||||
|
|
||||||
-spec register_iq_handler(binary(), binary(), atom(), atom(), list()) -> any().
|
|
||||||
|
|
||||||
register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
|
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) ->
|
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?
|
%% Why the hell do we have so many similar kicks?
|
||||||
c2s_handle_info(#{lang := Lang} = State, replaced) ->
|
c2s_handle_info(#{lang := Lang} = State, replaced) ->
|
||||||
@ -421,9 +419,6 @@ handle_info({route, From, To, Packet}, State) ->
|
|||||||
ok
|
ok
|
||||||
end,
|
end,
|
||||||
{noreply, State};
|
{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,
|
handle_info({register_iq_handler, Host, XMLNS, Module,
|
||||||
Function, Opts},
|
Function, Opts},
|
||||||
State) ->
|
State) ->
|
||||||
@ -744,9 +739,6 @@ process_iq(From, To, #iq{type = T, lang = Lang, sub_els = [El]} = Packet)
|
|||||||
XMLNS = xmpp:get_ns(El),
|
XMLNS = xmpp:get_ns(El),
|
||||||
Host = To#jid.lserver,
|
Host = To#jid.lserver,
|
||||||
case ets:lookup(sm_iqtable, {Host, XMLNS}) of
|
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}] ->
|
[{_, Module, Function, Opts}] ->
|
||||||
gen_iq_handler:handle(Host, Module, Function, Opts,
|
gen_iq_handler:handle(Host, Module, Function, Opts,
|
||||||
From, To, Packet);
|
From, To, Packet);
|
||||||
|
@ -60,7 +60,7 @@ start_link(Host, Module, Function) ->
|
|||||||
gen_server:start_link(?MODULE, [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,
|
add_iq_handler(Component, Host, NS, Module, Function,
|
||||||
Type) ->
|
Type) ->
|
||||||
@ -89,7 +89,7 @@ add_iq_handler(Component, Host, NS, Module, Function,
|
|||||||
Function, parallel)
|
Function, parallel)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec remove_iq_handler(component(), binary(), binary()) -> any().
|
-spec remove_iq_handler(component(), binary(), binary()) -> ok.
|
||||||
|
|
||||||
remove_iq_handler(Component, Host, NS) ->
|
remove_iq_handler(Component, Host, NS) ->
|
||||||
Component:unregister_iq_handler(Host, NS).
|
Component:unregister_iq_handler(Host, NS).
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
-type opts() :: [{atom(), any()}].
|
-type opts() :: [{atom(), any()}].
|
||||||
-type db_type() :: sql | mnesia | riak.
|
-type db_type() :: sql | mnesia | riak.
|
||||||
|
|
||||||
-callback start(binary(), opts()) -> any().
|
-callback start(binary(), opts()) -> ok | {ok, pid()}.
|
||||||
-callback stop(binary()) -> any().
|
-callback stop(binary()) -> any().
|
||||||
-callback mod_opt_type(atom()) -> fun((term()) -> term()) | [atom()].
|
-callback mod_opt_type(atom()) -> fun((term()) -> term()) | [atom()].
|
||||||
-callback depends(binary(), opts()) -> [{module(), hard | soft}].
|
-callback depends(binary(), opts()) -> [{module(), hard | soft}].
|
||||||
@ -145,19 +145,24 @@ start_module(Host, Module) ->
|
|||||||
{error, not_found_in_config}
|
{error, not_found_in_config}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec start_module(binary(), atom(), opts()) -> any().
|
-spec start_module(binary(), atom(), opts()) -> ok | {ok, pid()}.
|
||||||
|
|
||||||
start_module(Host, Module, Opts0) ->
|
start_module(Host, Module, Opts0) ->
|
||||||
|
?DEBUG("loading ~s at ~s", [Module, Host]),
|
||||||
Opts = validate_opts(Module, Opts0),
|
Opts = validate_opts(Module, Opts0),
|
||||||
ets:insert(ejabberd_modules,
|
ets:insert(ejabberd_modules,
|
||||||
#ejabberd_module{module_host = {Module, Host},
|
#ejabberd_module{module_host = {Module, Host},
|
||||||
opts = Opts}),
|
opts = Opts}),
|
||||||
try Module:start(Host, Opts) catch
|
try case Module:start(Host, Opts) of
|
||||||
Class:Reason ->
|
ok -> ok;
|
||||||
|
{ok, Pid} when is_pid(Pid) -> {ok, Pid};
|
||||||
|
Err -> erlang:error(Err)
|
||||||
|
end
|
||||||
|
catch Class:Reason ->
|
||||||
ets:delete(ejabberd_modules, {Module, Host}),
|
ets:delete(ejabberd_modules, {Module, Host}),
|
||||||
ErrorText =
|
ErrorText =
|
||||||
io_lib:format("Problem starting the module ~p for host "
|
io_lib:format("Problem starting the module ~s for host "
|
||||||
"~p ~n options: ~p~n ~p: ~p~n~p",
|
"~s ~n options: ~p~n ~p: ~p~n~p",
|
||||||
[Module, Host, Opts, Class, Reason,
|
[Module, Host, Opts, Class, Reason,
|
||||||
erlang:get_stacktrace()]),
|
erlang:get_stacktrace()]),
|
||||||
?CRITICAL_MSG(ErrorText, []),
|
?CRITICAL_MSG(ErrorText, []),
|
||||||
|
@ -70,8 +70,9 @@ start(Host, Opts) ->
|
|||||||
ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, announce_commands, 50),
|
ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, announce_commands, 50),
|
||||||
ejabberd_hooks:add(c2s_self_presence, Host,
|
ejabberd_hooks:add(c2s_self_presence, Host,
|
||||||
?MODULE, send_motd, 50),
|
?MODULE, send_motd, 50),
|
||||||
register(gen_mod:get_module_proc(Host, ?PROCNAME),
|
Pid = proc_lib:spawn(?MODULE, init, []),
|
||||||
proc_lib:spawn(?MODULE, init, [])).
|
register(gen_mod:get_module_proc(Host, ?PROCNAME), Pid),
|
||||||
|
{ok, Pid}.
|
||||||
|
|
||||||
depends(_Host, _Opts) ->
|
depends(_Host, _Opts) ->
|
||||||
[{mod_adhoc, hard}].
|
[{mod_adhoc, hard}].
|
||||||
|
@ -90,13 +90,13 @@ find_session(SID) ->
|
|||||||
|
|
||||||
start(Host, Opts) ->
|
start(Host, Opts) ->
|
||||||
start_jiffy(Opts),
|
start_jiffy(Opts),
|
||||||
|
Mod = gen_mod:ram_db_mod(global, ?MODULE),
|
||||||
|
Mod:init(),
|
||||||
TmpSup = gen_mod:get_module_proc(Host, ?PROCNAME),
|
TmpSup = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
TmpSupSpec = {TmpSup,
|
TmpSupSpec = {TmpSup,
|
||||||
{ejabberd_tmp_sup, start_link, [TmpSup, ejabberd_bosh]},
|
{ejabberd_tmp_sup, start_link, [TmpSup, ejabberd_bosh]},
|
||||||
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
permanent, infinity, supervisor, [ejabberd_tmp_sup]},
|
||||||
supervisor:start_child(ejabberd_sup, TmpSupSpec),
|
supervisor:start_child(ejabberd_sup, TmpSupSpec).
|
||||||
Mod = gen_mod:ram_db_mod(global, ?MODULE),
|
|
||||||
Mod:init().
|
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
TmpSup = gen_mod:get_module_proc(Host, ?PROCNAME),
|
TmpSup = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
|
@ -51,17 +51,15 @@
|
|||||||
|
|
||||||
start(Host, Opts) ->
|
start(Host, Opts) ->
|
||||||
case mod_proxy65_service:add_listener(Host, Opts) of
|
case mod_proxy65_service:add_listener(Host, Opts) of
|
||||||
{error, _} = Err -> erlang:error(Err);
|
{error, _} = Err ->
|
||||||
|
Err;
|
||||||
_ ->
|
_ ->
|
||||||
|
Mod = gen_mod:ram_db_mod(global, ?MODULE),
|
||||||
|
Mod:init(),
|
||||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
|
ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
|
||||||
transient, infinity, supervisor, [?MODULE]},
|
transient, infinity, supervisor, [?MODULE]},
|
||||||
case supervisor:start_child(ejabberd_sup, ChildSpec) of
|
supervisor:start_child(ejabberd_sup, ChildSpec)
|
||||||
{error, _} = Err -> erlang:error(Err);
|
|
||||||
_ ->
|
|
||||||
Mod = gen_mod:ram_db_mod(global, ?MODULE),
|
|
||||||
Mod:init()
|
|
||||||
end
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
|
@ -98,8 +98,9 @@ start(Host, Opts) ->
|
|||||||
true ->
|
true ->
|
||||||
ok
|
ok
|
||||||
end,
|
end,
|
||||||
register(gen_mod:get_module_proc(Host, ?PROCNAME),
|
Pid = spawn(?MODULE, init, [MyHost, Host, Search]),
|
||||||
spawn(?MODULE, init, [MyHost, Host, Search])).
|
register(gen_mod:get_module_proc(Host, ?PROCNAME), Pid),
|
||||||
|
{ok, Pid}.
|
||||||
|
|
||||||
init(Host, ServerHost, Search) ->
|
init(Host, ServerHost, Search) ->
|
||||||
case Search of
|
case Search of
|
||||||
|
Loading…
Reference in New Issue
Block a user