-behaviour(gen_server).
%% API
--export([start_link/0, route/1, have_connection/1,
+-export([start_link/0, stop/0, route/1, have_connection/1,
get_connections_pids/1, try_register/1,
remove_connection/2, start_connection/2, start_connection/3,
dirty_get_connections/0, allow_host/2,
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+-spec stop() -> ok.
+stop() ->
+ _ = supervisor:terminate_child(ejabberd_sup, ?MODULE),
+ _ = supervisor:delete_child(ejabberd_sup, ?MODULE),
+ ok.
+
clean_temporarily_blocked_table() ->
mnesia:clear_table(temporarily_blocked).
-protocol({xep, 114, '1.6'}).
%% ejabberd_listener callbacks
--export([start/3, start_link/3, accept/1]).
+-export([start/3, start_link/3, stop/0, accept/1]).
-export([listen_opt_type/1, listen_options/0]).
%% xmpp_stream_in callbacks
-export([init/1, handle_info/2, terminate/2, code_change/3]).
-export([handle_stream_start/2, handle_auth_success/4, handle_auth_failure/4,
handle_authenticated_packet/2, get_password_fun/1, tls_options/1]).
%% API
--export([send/2, close/1, close/2]).
+-export([send/2, close/1, close/2, stop/1]).
-include("xmpp.hrl").
-include("logger.hrl").
xmpp_stream_in:start_link(?MODULE, [{SockMod, Socket}, Opts],
ejabberd_config:fsm_limit_opts(Opts)).
+-spec stop() -> ok.
+stop() ->
+ Err = xmpp:serr_system_shutdown(),
+ lists:foreach(
+ fun({_Id, Pid, _Type, _Module}) ->
+ send(Pid, Err),
+ stop(Pid),
+ supervisor:terminate_child(ejabberd_service_sup, Pid)
+ end, supervisor:which_children(ejabberd_service_sup)),
+ _ = supervisor:terminate_child(ejabberd_sup, ejabberd_service_sup),
+ _ = supervisor:delete_child(ejabberd_sup, ejabberd_service_sup),
+ ok.
+
accept(Ref) ->
xmpp_stream_in:accept(Ref).
close(Ref, Reason) ->
xmpp_stream_in:close(Ref, Reason).
+-spec stop(pid()) -> ok;
+ (state()) -> no_return().
+stop(Ref) ->
+ xmpp_stream_in:stop(Ref).
+
%%%===================================================================
%%% xmpp_stream_in callbacks
%%%===================================================================
start_link() ->
?GEN_SERVER:start_link({local, ?MODULE}, ?MODULE, [], []).
--spec stop() -> ok | {error, atom()}.
+-spec stop() -> ok.
stop() ->
- case supervisor:terminate_child(ejabberd_sup, ?MODULE) of
- ok -> supervisor:delete_child(ejabberd_sup, ?MODULE);
- Err -> Err
- end.
+ _ = supervisor:terminate_child(ejabberd_sup, ?MODULE),
+ _ = supervisor:delete_child(ejabberd_sup, ?MODULE),
+ _ = supervisor:terminate_child(ejabberd_sup, ejabberd_c2s_sup),
+ _ = supervisor:delete_child(ejabberd_sup, ejabberd_c2s_sup),
+ ok.
-spec route(jid(), term()) -> ok.
%% @doc route arbitrary term to c2s process(es)