}
/*! \brief NULL handler so we can collect the child exit status */
-static void null_sig_handler(int signal)
+static void _null_sig_handler(int signal)
{
}
+static struct sigaction null_sig_handler = {
+ .sa_handler = _null_sig_handler,
+};
+
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)
{
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);
}
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);
}
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)
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;
;
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 an X-term or screen title */
static void set_title(char *text)
{
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
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(SIGCHLD, child_handler);
+ sigaction(SIGHUP, &hup_handler, NULL);
+ sigaction(SIGCHLD, &child_handler, NULL);
signal(SIGPIPE, SIG_IGN);
/* ensure that the random number generators are seeded with a different value every time
logger_rotate_help },
};
-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,
+};
+
int init_logger(void)
{
char tmp[256];
int res = 0;
/* auto rotate if sig SIGXFSZ comes a-knockin */
- (void) signal(SIGXFSZ,(void *) handle_SIGXFSZ);
+ sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
/* register the logger cli commands */
ast_cli_register_multiple(cli_logger, sizeof(cli_logger) / sizeof(struct ast_cli_entry));
mkdir((char *)ast_config_AST_LOG_DIR, 0755);
-
+
/* create log channels */
init_logger_chain();