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);
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 = {
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();