]> granicus.if.org Git - ejabberd/commitdiff
If extauth script crashes, ejabberd should restart it (EJAB-1428)
authorBadlop <badlop@process-one.net>
Mon, 11 Apr 2011 19:27:19 +0000 (21:27 +0200)
committerBadlop <badlop@process-one.net>
Mon, 11 Apr 2011 19:27:19 +0000 (21:27 +0200)
src/extauth.erl

index 3b2e7db64e80ce365374f3f6a0c6e6170578a1a5..f4939298381b15255cc777b6ad2a4550d1d4b318 100644 (file)
 start(Host, ExtPrg) ->
     lists:foreach(
        fun(This) ->
-           spawn(?MODULE, init, [get_process_name(Host, This), ExtPrg])
+           start_instance(get_process_name(Host, This), ExtPrg)
        end,
        lists:seq(0, get_instances(Host)-1)
     ).
 
+start_instance(ProcessName, ExtPrg) ->
+    spawn(?MODULE, init, [ProcessName, ExtPrg]).
+
+restart_instance(ProcessName, ExtPrg) ->
+    unregister(ProcessName),
+    start_instance(ProcessName, ExtPrg).
+
 init(ProcessName, ExtPrg) ->
     register(ProcessName, self()),
     process_flag(trap_exit,true),
@@ -125,8 +132,7 @@ loop(Port, Timeout, ProcessName, ExtPrg) ->
                 Timeout ->
                     ?ERROR_MSG("extauth call '~p' didn't receive response", [Msg]),
                    Caller ! {eauth, false},
-                   unregister(ProcessName),
-                   Pid = spawn(?MODULE, init, [ProcessName, ExtPrg]),
+                   Pid = restart_instance(ProcessName, ExtPrg),
                    flush_buffer_and_forward_messages(Pid),
                    exit(port_terminated)
            end;
@@ -137,7 +143,9 @@ loop(Port, Timeout, ProcessName, ExtPrg) ->
                    exit(normal)
            end;
        {'EXIT', Port, Reason} ->
-           ?CRITICAL_MSG("~p ~n", [Reason]),
+           ?CRITICAL_MSG("extauth script has exitted abruptly with reason '~p'", [Reason]),
+           Pid = restart_instance(ProcessName, ExtPrg),
+           flush_buffer_and_forward_messages(Pid),
            exit(port_terminated)
     end.