diff options
author | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-26 11:40:19 +0300 |
---|---|---|
committer | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-26 11:40:19 +0300 |
commit | 0aa004bafc2ddba0a51428531ffb5ee4a675bc1b (patch) | |
tree | 7c55dcedea3ffd57bc13ad6894d22fcd039dca3e /src/ejabberd_service.erl | |
parent | Fix default value of resume_timeout (diff) |
Improve ejabberd halting procedure
Diffstat (limited to 'src/ejabberd_service.erl')
-rw-r--r-- | src/ejabberd_service.erl | 22 |
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 %%%=================================================================== |