void SignalHandler::signalled(int sock) { char signal; read(sock, &signal, 1); switch(signal) { case 'I': emit sigint(); break; case 'T': emit sigterm(); break; case 'H': emit sighup(); break; } }
void generic_handler(int signal){ switch (signal) { case SIGINT: sigint(); break; case SIGQUIT: sigquit(); break; case SIGHUP: sighup(); break; case SIGSEGV: sigsegv(); break; case SIGTERM: sigterm(); break; } }
static int start() { int lockfd; int pipe3fd[2]; char temp_buf; lockfd=ll_daemon_start(LOCKFILE); if (lockfd <= 0) { close(3); return (lockfd); } if (lockfd == 3) { lockfd=dup(lockfd); /* Get it out of the way */ if (lockfd < 0) { perror("dup"); return (-1); } } if (reserve3(pipe3fd)) { return (1); } fcntl(lockfd, F_SETFD, FD_CLOEXEC); fcntl(pipe3fd[0], F_SETFD, FD_CLOEXEC); fcntl(3, F_SETFD, FD_CLOEXEC); /* For the logger */ clog_start_logger("courierfilter"); clog_open_stderr(0); fcntl(3, F_SETFD, 0); signal(SIGPIPE, SIG_IGN); dup2(2, 1); sighup(); close(0); open("/dev/null", O_RDONLY); close(3); if (read(pipe3fd[0], &temp_buf, 1) != 1) ; /* ignore */ close(pipe3fd[0]); signal(SIGHUP, sighuphandler); signal(SIGTERM, sigtermhandler); ll_daemon_started(PIDFILE, lockfd); while (!sigterm_received) { if (sighup_received) { sighup_received=0; if (reserve3(pipe3fd) == 0) { sighup(); close(3); close(pipe3fd[0]); } signal(SIGHUP, sighuphandler); } #if HAVE_SIGSUSPEND { sigset_t ss; sigemptyset(&ss); sigsuspend(&ss); } #else sigpause(0); #endif } while (filterlist) kill1filter(&filterlist); unlink(PIDFILE); return (0); }