aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2010-01-03 00:35:51 +0000
committerBadlop <badlop@process-one.net>2010-01-03 00:35:51 +0000
commit7cbda8badbc0323ae7e52400c3abc70a093b8bbf (patch)
tree55e358b67b100354bfc278bf350330d43650acda
parentImprove log message when showing lines of config file. (diff)
When ejabberd stops, send stream close to clients (thanks to Alexey Shchepin)(EJAB-1112)
SVN Revision: 2852
-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).