/***************************************************************************** NAME: sighandler.c -- signal handler AUTHOR: David Relson ******************************************************************************/ #include "common.h" #include #include #include #include "sighandler.h" #include "wordlists.h" /* Global Definitions */ sig_atomic_t fDie = false; /* Function Definitions */ static void mysignal(int sig, void (*hdl)(int)) { #ifdef SA_RESTART struct sigaction sa; memset( &sa, 0, sizeof(sa)); sa.sa_handler = hdl; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(sig, &sa, NULL)) { fprintf(stderr, "Cannot set signal %d handler to %p: %s\n", sig, (void *)hdl, strerror(errno)); exit(EX_ERROR); } #endif } static void mysigdie(int sig) { (void) sig; /* suppress compiler warning */ if (!fDie) fDie = true; else exit(EX_ERROR); /* XXX FIXME: Need something that is async-signal-safe here! Note that _exit bypasses atexit, so we may see database corruption! */ } void signal_setup(void) { mysignal(SIGINT, mysigdie); /* 2 */ mysignal(SIGPIPE, SIG_IGN); /* 1 */ mysignal(SIGTERM, mysigdie); /* 15 */ }