From ab6470e0146493969887781bc8efd5a615f879c7 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 21 Mar 2009 17:46:43 +0100 Subject: [PATCH] server: Use a temporary SIGCHLD handler to catch afs init failures. If afs dies immediately on startup (because of dirty tables) para_server would not notice as the SIGCHLD handler is being intalled after the call to afs_init(). --- server.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/server.c b/server.c index 9c069913..4415cdcd 100644 --- a/server.c +++ b/server.c @@ -467,6 +467,12 @@ static int init_afs(void) return afs_server_socket[0]; } +__noreturn static void tmp_sigchld_handler(__a_unused int s) +{ + PARA_EMERG_LOG("caught early SIGCHLD\n"); + exit(EXIT_FAILURE); +} + static void server_init(int argc, char **argv) { struct server_cmdline_parser_params params = { @@ -509,6 +515,15 @@ static void server_init(int argc, char **argv) PARA_EMERG_LOG("failed to ignore SIGUSR1\n"); exit(EXIT_FAILURE); } + /* + * We have to install a SIGCHLD handler before the afs process is being + * forked off. Otherwise, para_server does not notice if afs dies before + * the SIGCHLD handler has been installed by init_signal_task() below. + */ + if (signal(SIGCHLD, tmp_sigchld_handler) == SIG_ERR) { + PARA_EMERG_LOG("failed to install temporary SIGCHLD handler\n"); + exit(EXIT_FAILURE); + } PARA_NOTICE_LOG("initializing the audio file selector\n"); afs_socket = init_afs(); init_signal_task(); -- 2.39.2