]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - server.c
Introduce para_sigaction().
[paraslash.git] / server.c
index 9c06991378512172e95b70165118ae1ea873bdb1..1e4caf08c90d0e04233a987f6e520e19850c20c5 100644 (file)
--- a/server.c
+++ b/server.c
@@ -300,6 +300,9 @@ static void signal_post_select(struct sched *s, struct task *t)
                PARA_EMERG_LOG("terminating on signal %d\n", st->signum);
 genocide:
                kill(0, SIGTERM);
+               free(mmd->afd.afhi.chunk_table);
+               free(mmd->afd.afhi.info_string);
+               close_listed_fds();
                mutex_destroy(mmd_mutex);
                shm_detach(mmd);
                exit(EXIT_FAILURE);
@@ -467,6 +470,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 +518,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();