diff options
Diffstat (limited to '')
-rw-r--r-- | src/sig_handlers.c | 202 |
1 files changed, 110 insertions, 92 deletions
diff --git a/src/sig_handlers.c b/src/sig_handlers.c index 7eab68b6f..799e27f83 100644 --- a/src/sig_handlers.c +++ b/src/sig_handlers.c @@ -39,129 +39,143 @@ extern volatile int masterPid; extern volatile int mainPid; -int masterHandlePendingSignals() { - if(signal_is_pending(SIGINT) || signal_is_pending(SIGTERM)) { - DEBUG("master process got SIGINT or SIGTERM, exiting\n"); +int masterHandlePendingSignals() +{ + if (signal_is_pending(SIGINT) || signal_is_pending(SIGTERM)) { + DEBUG("master process got SIGINT or SIGTERM, exiting\n"); return COMMAND_RETURN_KILL; - } + } - if(signal_is_pending(SIGHUP)) { + if (signal_is_pending(SIGHUP)) { signal_clear(SIGHUP); /* Forward it to the main process, which will update the DB */ - kill(mainPid, SIGHUP); + kill(mainPid, SIGHUP); } - return 0; } -int handlePendingSignals() { +int handlePendingSignals() +{ /* this SIGUSR1 signal comes before the KILL signals, because there if the process is * looping, waiting for this signal, it will not respond to the KILL signal. This might be * better implemented by using bit-wise defines and or'ing of the COMMAND_FOO as return. */ - if (signal_is_pending(SIGUSR1)) { + if (signal_is_pending(SIGUSR1)) { signal_clear(SIGUSR1); DEBUG("The master process is ready to receive signals\n"); return COMMAND_MASTER_READY; } - - if(signal_is_pending(SIGINT) || signal_is_pending(SIGTERM)) { - DEBUG("main process got SIGINT or SIGTERM, exiting\n"); + + if (signal_is_pending(SIGINT) || signal_is_pending(SIGTERM)) { + DEBUG("main process got SIGINT or SIGTERM, exiting\n"); return COMMAND_RETURN_KILL; - } + } - if(signal_is_pending(SIGHUP)) { - DEBUG("got SIGHUP, rereading DB\n"); + if (signal_is_pending(SIGHUP)) { + DEBUG("got SIGHUP, rereading DB\n"); signal_clear(SIGHUP); - if(!isUpdatingDB()) { - readDirectoryDB(); - playlistVersionChange(); - } - if(myfprintfCloseAndOpenLogFile()<0) return COMMAND_RETURN_KILL; - playerCycleLogFiles(); + if (!isUpdatingDB()) { + readDirectoryDB(); + playlistVersionChange(); + } + if (myfprintfCloseAndOpenLogFile() < 0) + return COMMAND_RETURN_KILL; + playerCycleLogFiles(); } return 0; } -void chldSigHandler(int signal) { +void chldSigHandler(int signal) +{ int status; int pid; DEBUG("main process got SIGCHLD\n"); - while(0 != (pid = wait3(&status,WNOHANG,NULL))) { - if(pid<0) { - if(errno==EINTR) continue; - else break; + while (0 != (pid = wait3(&status, WNOHANG, NULL))) { + if (pid < 0) { + if (errno == EINTR) + continue; + else + break; } - directory_sigChldHandler(pid,status); + directory_sigChldHandler(pid, status); } } -void masterChldSigHandler(int signal) { +void masterChldSigHandler(int signal) +{ int status; int pid; DEBUG("master process got SIGCHLD\n"); - while(0 != (pid = wait3(&status,WNOHANG,NULL))) { - if(pid<0) { - if(errno==EINTR) continue; - else break; + while (0 != (pid = wait3(&status, WNOHANG, NULL))) { + if (pid < 0) { + if (errno == EINTR) + continue; + else + break; } - DEBUG("PID: %d\n",pid); - if (pid == mainPid) kill(getpid(), SIGTERM); - player_sigChldHandler(pid,status); + DEBUG("PID: %d\n", pid); + if (pid == mainPid) + kill(getpid(), SIGTERM); + player_sigChldHandler(pid, status); } } int playerInitReal(); -void masterSigUsr2Handler(int signal) { +void masterSigUsr2Handler(int signal) +{ DEBUG("Master process got SIGUSR2 starting a new player process\n"); if (getPlayerPid() <= 0) playerInitReal(); } -void masterInitSigHandlers() { +void masterInitSigHandlers() +{ struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; - while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGPIPE, &sa, NULL) < 0 && errno == EINTR) ; sa.sa_handler = masterChldSigHandler; - while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGCHLD, &sa, NULL) < 0 && errno == EINTR) ; sa.sa_handler = masterSigUsr2Handler; - while(sigaction(SIGUSR2,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGUSR2, &sa, NULL) < 0 && errno == EINTR) ; signal_handle(SIGUSR1); - signal_handle(SIGINT); - signal_handle(SIGTERM); - signal_handle(SIGHUP); + signal_handle(SIGINT); + signal_handle(SIGTERM); + signal_handle(SIGHUP); } -void initSigHandlers() { +void initSigHandlers() +{ struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; - while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGPIPE, &sa, NULL) < 0 && errno == EINTR) ; sa.sa_handler = chldSigHandler; - while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); - signal_handle(SIGUSR2); - signal_handle(SIGUSR1); - signal_handle(SIGINT); - signal_handle(SIGTERM); - signal_handle(SIGHUP); + while (sigaction(SIGCHLD, &sa, NULL) < 0 && errno == EINTR) ; + signal_handle(SIGUSR2); + signal_handle(SIGUSR1); + signal_handle(SIGINT); + signal_handle(SIGTERM); + signal_handle(SIGHUP); } -void finishSigHandlers() { - signal_unhandle(SIGINT); - signal_unhandle(SIGUSR1); - signal_unhandle(SIGTERM); - signal_unhandle(SIGHUP); +void finishSigHandlers() +{ + signal_unhandle(SIGINT); + signal_unhandle(SIGUSR1); + signal_unhandle(SIGTERM); + signal_unhandle(SIGHUP); } -void setSigHandlersForDecoder() { +void setSigHandlersForDecoder() +{ struct sigaction sa; finishSigHandlers(); @@ -169,65 +183,69 @@ void setSigHandlersForDecoder() { sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; - while(sigaction(SIGHUP,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGINT,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGHUP, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGINT, &sa, NULL) < 0 && errno == EINTR) ; sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = decodeSigHandler; - while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGTERM,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGCHLD, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGTERM, &sa, NULL) < 0 && errno == EINTR) ; } -void ignoreSignals() { +void ignoreSignals() +{ struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; sa.sa_sigaction = NULL; - while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGUSR1,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGUSR2,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGINT,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGTERM,&sa,NULL)<0 && errno==EINTR); - while(sigaction(SIGHUP,&sa,NULL)<0 && errno==EINTR); + while (sigaction(SIGPIPE, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGCHLD, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGUSR1, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGUSR2, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGINT, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGTERM, &sa, NULL) < 0 && errno == EINTR) ; + while (sigaction(SIGHUP, &sa, NULL) < 0 && errno == EINTR) ; } -void waitOnSignals() { +void waitOnSignals() +{ sigset_t sset; sigfillset(&sset); - sigdelset(&sset,SIGCHLD); - sigdelset(&sset,SIGUSR1); - sigdelset(&sset,SIGUSR2); - sigdelset(&sset,SIGHUP); - sigdelset(&sset,SIGINT); - sigdelset(&sset,SIGTERM); + sigdelset(&sset, SIGCHLD); + sigdelset(&sset, SIGUSR1); + sigdelset(&sset, SIGUSR2); + sigdelset(&sset, SIGHUP); + sigdelset(&sset, SIGINT); + sigdelset(&sset, SIGTERM); sigsuspend(&sset); } -void blockSignals() { +void blockSignals() +{ sigset_t sset; sigemptyset(&sset); - sigaddset(&sset,SIGCHLD); - sigaddset(&sset,SIGUSR1); - sigaddset(&sset,SIGUSR2); - sigaddset(&sset,SIGHUP); - sigaddset(&sset,SIGINT); - sigaddset(&sset,SIGTERM); - while(sigprocmask(SIG_BLOCK,&sset,NULL)<0 && errno==EINTR); + sigaddset(&sset, SIGCHLD); + sigaddset(&sset, SIGUSR1); + sigaddset(&sset, SIGUSR2); + sigaddset(&sset, SIGHUP); + sigaddset(&sset, SIGINT); + sigaddset(&sset, SIGTERM); + while (sigprocmask(SIG_BLOCK, &sset, NULL) < 0 && errno == EINTR) ; } -void unblockSignals() { +void unblockSignals() +{ sigset_t sset; sigemptyset(&sset); - sigaddset(&sset,SIGCHLD); - sigaddset(&sset,SIGUSR1); - sigaddset(&sset,SIGUSR2); - sigaddset(&sset,SIGHUP); - sigaddset(&sset,SIGINT); - sigaddset(&sset,SIGTERM); - while(sigprocmask(SIG_UNBLOCK,&sset,NULL)<0 && errno==EINTR); + sigaddset(&sset, SIGCHLD); + sigaddset(&sset, SIGUSR1); + sigaddset(&sset, SIGUSR2); + sigaddset(&sset, SIGHUP); + sigaddset(&sset, SIGINT); + sigaddset(&sset, SIGTERM); + while (sigprocmask(SIG_UNBLOCK, &sset, NULL) < 0 && errno == EINTR) ; } |