summaryrefslogtreecommitdiff
path: root/src/ejabberd_service.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-26 11:40:19 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-26 11:40:19 +0300
commit0aa004bafc2ddba0a51428531ffb5ee4a675bc1b (patch)
tree7c55dcedea3ffd57bc13ad6894d22fcd039dca3e /src/ejabberd_service.erl
parentFix default value of resume_timeout (diff)
Improve ejabberd halting procedure
Diffstat (limited to 'src/ejabberd_service.erl')
-rw-r--r--src/ejabberd_service.erl22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl
index 50356245..6fa6c8dd 100644
--- a/src/ejabberd_service.erl
+++ b/src/ejabberd_service.erl
@@ -26,14 +26,14 @@
-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").
@@ -53,6 +53,19 @@ start_link(SockMod, Socket, Opts) ->
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).
@@ -70,6 +83,11 @@ close(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
%%%===================================================================