Index: main/asterisk.c =================================================================== --- main/asterisk.c (revision 265924) +++ main/asterisk.c (working copy) @@ -962,16 +962,24 @@ } /*! \brief NULL handler so we can collect the child exit status */ -static void null_sig_handler(int sig) +static void _null_sig_handler(int sig) { } +static struct sigaction null_sig_handler = { + .sa_handler = _null_sig_handler, +}; + +static struct sigaction ignore_sig_handler = { + .sa_handler = SIG_IGN, +}; + AST_MUTEX_DEFINE_STATIC(safe_system_lock); /*! \brief Keep track of how many threads are currently trying to wait*() on * a child process */ static unsigned int safe_system_level = 0; -static void *safe_system_prev_handler; +static struct sigaction safe_system_prev_handler; void ast_replace_sigchld(void) { @@ -981,8 +989,9 @@ level = safe_system_level++; /* only replace the handler if it has not already been done */ - if (level == 0) - safe_system_prev_handler = signal(SIGCHLD, null_sig_handler); + if (level == 0) { + sigaction(SIGCHLD, &null_sig_handler, &safe_system_prev_handler); + } ast_mutex_unlock(&safe_system_lock); } @@ -995,8 +1004,9 @@ level = --safe_system_level; /* only restore the handler if we are the last one */ - if (level == 0) - signal(SIGCHLD, safe_system_prev_handler); + if (level == 0) { + sigaction(SIGCHLD, &safe_system_prev_handler, NULL); + } ast_mutex_unlock(&safe_system_lock); } @@ -1429,13 +1439,16 @@ system call. We don't actually need to do anything though. Remember: Cannot EVER ast_log from within a signal handler */ -static void urg_handler(int num) +static void _urg_handler(int num) { - signal(num, urg_handler); return; } -static void hup_handler(int num) +static struct sigaction urg_handler = { + .sa_handler = _urg_handler, +}; + +static void _hup_handler(int num) { int a = 0; if (option_verbose > 1) @@ -1448,10 +1461,13 @@ fprintf(stderr, "hup_handler: write() failed: %s\n", strerror(errno)); } } - signal(num, hup_handler); } -static void child_handler(int sig) +static struct sigaction hup_handler = { + .sa_handler = _hup_handler, +}; + +static void _child_handler(int sig) { /* Must not ever ast_log or ast_verbose within signal handler */ int n, status; @@ -1463,9 +1479,12 @@ ; if (n == 0 && option_debug) printf("Huh? Child handler, but nobody there?\n"); - signal(sig, child_handler); } +static struct sigaction child_handler = { + .sa_handler = _child_handler, +}; + /*! \brief Set maximum open files */ static void set_ulimit(int value) { @@ -1664,7 +1683,7 @@ sig_flags.need_quit = 1; if (sig_alert_pipe[1] != -1) { if (write(sig_alert_pipe[1], &a, sizeof(a)) < 0) { - fprintf(stderr, "hup_handler: write() failed: %s\n", strerror(errno)); + fprintf(stderr, "quit_handler: write() failed: %s\n", strerror(errno)); } } /* There is no need to restore the signal handler here, since the app @@ -3304,7 +3323,7 @@ /* Must install this signal handler up here to ensure that if the canary * fails to execute that it doesn't kill the Asterisk process. */ - signal(SIGCHLD, child_handler); + sigaction(SIGCHLD, &child_handler, NULL); /* It's common on some platforms to clear /var/run at boot. Create the * socket file directory before we drop privileges. */ @@ -3503,7 +3522,7 @@ snprintf(canary_filename, sizeof(canary_filename), "%s/alt.asterisk.canary.tweet.tweet.tweet", ast_config_AST_RUN_DIR); /* Don't let the canary child kill Asterisk, if it dies immediately */ - signal(SIGPIPE, SIG_IGN); + sigaction(SIGPIPE, &ignore_sig_handler, NULL); canary_pid = fork(); if (canary_pid == 0) { @@ -3550,11 +3569,11 @@ sigaddset(&sigs, SIGPIPE); sigaddset(&sigs, SIGWINCH); pthread_sigmask(SIG_BLOCK, &sigs, NULL); - signal(SIGURG, urg_handler); + sigaction(SIGURG, &urg_handler, NULL); signal(SIGINT, __quit_handler); signal(SIGTERM, __quit_handler); - signal(SIGHUP, hup_handler); - signal(SIGPIPE, SIG_IGN); + sigaction(SIGHUP, &hup_handler, NULL); + sigaction(SIGPIPE, &ignore_sig_handler, NULL); /* ensure that the random number generators are seeded with a different value every time Asterisk is started Index: main/logger.c =================================================================== --- main/logger.c (revision 265924) +++ main/logger.c (working copy) @@ -827,13 +827,16 @@ AST_CLI_DEFINE(handle_logger_set_level, "Enables/Disables a specific logging level for this console") }; -static int handle_SIGXFSZ(int sig) +static void _handle_SIGXFSZ(int sig) { /* Indicate need to reload */ filesize_reload_needed = 1; - return 0; } +static struct sigaction handle_SIGXFSZ = { + .sa_handler = _handle_SIGXFSZ, +}; + static void ast_log_vsyslog(int level, const char *file, int line, const char *function, char *str, long pid) { char buf[BUFSIZ]; @@ -1007,7 +1010,7 @@ int res = 0; /* auto rotate if sig SIGXFSZ comes a-knockin */ - (void) signal(SIGXFSZ, (void *) handle_SIGXFSZ); + sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); /* start logger thread */ ast_cond_init(&logcond, NULL); Index: utils/extconf.c =================================================================== --- utils/extconf.c (revision 265924) +++ utils/extconf.c (working copy) @@ -1258,14 +1258,18 @@ /*! \brief Keep track of how many threads are currently trying to wait*() on * a child process */ static unsigned int safe_system_level = 0; -static void *safe_system_prev_handler; +static struct sigaction safe_system_prev_handler; /*! \brief NULL handler so we can collect the child exit status */ -static void null_sig_handler(int sig) +static void _null_sig_handler(int sig) { } +static struct sigaction null_sig_handler = { + .sa_handler = _null_sig_handler, +}; + void ast_replace_sigchld(void); void ast_replace_sigchld(void) @@ -1275,9 +1279,9 @@ level = safe_system_level++; /* only replace the handler if it has not already been done */ - if (level == 0) - safe_system_prev_handler = signal(SIGCHLD, null_sig_handler); - + if (level == 0) { + sigaction(SIGCHLD, &null_sig_handler, &safe_system_prev_handler); + } } void ast_unreplace_sigchld(void); @@ -1289,9 +1293,9 @@ level = --safe_system_level; /* only restore the handler if we are the last one */ - if (level == 0) - signal(SIGCHLD, safe_system_prev_handler); - + if (level == 0) { + sigaction(SIGCHLD, &safe_system_prev_handler, NULL); + } } int ast_safe_system(const char *s);