aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ejabberd_app.erl9
-rw-r--r--src/ejabberd_c2s.erl15
2 files changed, 24 insertions, 0 deletions
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
index 2e6d04251..b563b6f6e 100644
--- a/src/ejabberd_app.erl
+++ b/src/ejabberd_app.erl
@@ -77,6 +77,8 @@ start(_, _) ->
prep_stop(State) ->
stop_modules(),
ejabberd_admin:stop(),
+ broadcast_c2s_shutdown(),
+ timer:sleep(5000),
State.
%% All the processes were killed when this function is called
@@ -198,6 +200,13 @@ add_windows_nameservers() ->
lists:foreach(fun(IPT) -> inet_db:add_ns(IPT) end, IPTs).
+broadcast_c2s_shutdown() ->
+ Children = supervisor:which_children(ejabberd_c2s_sup),
+ lists:foreach(
+ fun({_, C2SPid, _, _}) ->
+ C2SPid ! system_shutdown
+ end, Children).
+
%%%
%%% PID file
%%%
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index d7684d0f5..efb432314 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -1304,6 +1304,21 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
handle_info({'DOWN', Monitor, _Type, _Object, _Info}, _StateName, StateData)
when Monitor == StateData#state.socket_monitor ->
{stop, normal, StateData};
+handle_info(system_shutdown, StateName, StateData) ->
+ case StateName of
+ wait_for_stream ->
+ Header = io_lib:format(?STREAM_HEADER,
+ ["none", ?MYNAME, " version='1.0'", ""]),
+ send_text(StateData, Header),
+ send_element(StateData, ?SERR_SYSTEM_SHUTDOWN),
+ send_text(StateData, ?STREAM_TRAILER),
+ ok;
+ _ ->
+ send_element(StateData, ?SERR_SYSTEM_SHUTDOWN),
+ send_text(StateData, ?STREAM_TRAILER),
+ ok
+ end,
+ {stop, normal, StateData};
handle_info(Info, StateName, StateData) ->
?ERROR_MSG("Unexpected info: ~p", [Info]),
fsm_next_state(StateName, StateData).