void trap_signals () { switch (trapping) { case -1: /* first time */ #define SETSIG(SIG) \ if (signal(SIG, SIG_IGN) != SIG_IGN) \ signal (SIG, catch); SETSIG (SIGHUP); SETSIG (SIGINT); SETSIG (SIGQUIT); SETSIG (SIGTERM); break; case 0: /* currently ignoring */ signal (SIGHUP, old_sighup); signal (SIGINT, old_sigint); signal (SIGQUIT, old_sigquit); signal (SIGTERM, old_sigterm); trapping = 1; break; case 1: /* already trapping */ break; } return; }
void sig_init(void) { int i; struct sigaction sa; for (i = 1; i < NSIG; i++) IGNSIG(sa, i, SA_RESTART); SETSIG(sa, SIGCHLD, chld_handler, SA_RESTART); }
int main(int argc, char** argv) try { if(!setup(argc, argv)) { usage(); exit(-2); } std::cerr << "parsed channels: "; std::copy(channel_list.begin(), channel_list.end(), std::ostream_iterator<int> (std::cerr, " ")); std::cerr << std::endl; std::cerr << "nflogd starting..." << std::endl; PacketHandler ph(pcap_filename); NFmain nf(channel_list, [ph = std::ref(ph)](struct nflog_data *nfa){ ph(nfa); }); // setup signal SETSIG(SIGTERM, term_handler, SA_RESTART); SETSIG(SIGINT, term_handler, SA_RESTART); SETSIG(SIGHUP, hup_handler, SA_RESTART); std::cerr << "going into main loop" << std::endl; switch_user(); set_dumpable(); nf.loop(term_flag); std::cerr << "terminating..." << std::endl; return 0; } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return -1; }
/* * Setup limited set of SysV compatible signals to respond to */ void sig_setup(void) { struct sigaction sa; _d("Setup signals"); /* Cleanup any stale finit control files */ remove(SYNC_SHUTDOWN); remove(SYNC_STOPPED); /* Standard SysV init calls ctrl-alt-delete handler */ SETSIG(sa, SIGINT, shutdown_handler, 0); SETSIG(sa, SIGPWR, shutdown_handler, 0); /* Ignore SIGUSR1/2 for now, only BusyBox init implements them as reboot+halt. */ // SETSIG2(sa, SIGUSR1, reopen_initctl, 0); // SETSIG2(sa, SIGUSR2, pwrdwn_handler, 0); /* Init must ignore SIGTERM. May otherwise get false SIGTERM in forked children! */ IGNSIG(sa, SIGTERM, 0); /* Some C APIs may need SIGALRM for implementing timers. */ IGNSIG(sa, SIGALRM, 0); /* We don't have any /etc/inittab yet, reread finit.conf? */ IGNSIG(sa, SIGHUP, 0); /* Stopping init is a bit tricky. */ SETSIG(sa, SIGSTOP, sigstop_handler, 0); SETSIG(sa, SIGTSTP, sigstop_handler, 0); SETSIG(sa, SIGCONT, sigcont_handler, 0); /* Disable CTRL-ALT-DELETE from kernel, we handle shutdown gracefully with SIGINT, above */ reboot(RB_DISABLE_CAD); setsid(); }
void pone_signal_init(pone_world* world) { pone_val* module = pone_module_new(world, "signal"); pone_module_put(world, module, "notify", pone_code_new_c(world, meth_signal_notify)); pone_module_put(world, module, "kill", pone_code_new_c(world, meth_signal_kill)); #define SETSIG(sig) \ pone_module_put(world, module, #sig, pone_int_new(world, sig)) SETSIG(SIGHUP); SETSIG(SIGINT); SETSIG(SIGQUIT); SETSIG(SIGILL); SETSIG(SIGABRT); SETSIG(SIGFPE); SETSIG(SIGKILL); SETSIG(SIGSEGV); SETSIG(SIGPIPE); SETSIG(SIGALRM); SETSIG(SIGTERM); SETSIG(SIGUSR1); SETSIG(SIGUSR2); SETSIG(SIGCHLD); SETSIG(SIGCONT); SETSIG(SIGSTOP); SETSIG(SIGTSTP); SETSIG(SIGTTIN); SETSIG(SIGTTOU); SETSIG(SIGBUS); #ifdef SIGPOLL SETSIG(SIGPOLL); #endif SETSIG(SIGPROF); SETSIG(SIGSYS); SETSIG(SIGTRAP); SETSIG(SIGURG); SETSIG(SIGVTALRM); SETSIG(SIGXCPU); SETSIG(SIGXFSZ); #undef SETSIG pone_universe_set_global(world->universe, "signal", module); }
static void ignore_sigs(char *list) { char *str, *p; int ignore = 1; if (list == NULL || *list == '\0') { return; } str = strdup(list); p = strtok(str, ":,"); #define SETSIG(x, y) \ if (strstr(p, x)) { \ if (ignore) { \ signal(y, SIG_IGN); \ } else { \ signal(y, interrupted); \ } \ } #ifdef SIG_IGN while (p) { if (!strcmp(p, "ignore")) { ignore = 1; } else if (!strcmp(p, "exit")) { ignore = 0; } /* Take off every 'sig' ;-) */ #ifdef SIGHUP SETSIG("HUP", SIGHUP); #endif #ifdef SIGINT SETSIG("INT", SIGINT); #endif #ifdef SIGQUIT SETSIG("QUIT", SIGQUIT); #endif #ifdef SIGTRAP SETSIG("TRAP", SIGTRAP); #endif #ifdef SIGABRT SETSIG("ABRT", SIGABRT); #endif #ifdef SIGBUS SETSIG("BUS", SIGBUS); #endif #ifdef SIGFPE SETSIG("FPE", SIGFPE); #endif #ifdef SIGSEGV SETSIG("SEGV", SIGSEGV); #endif #ifdef SIGPIPE SETSIG("PIPE", SIGPIPE); #endif #ifdef SIGTERM SETSIG("TERM", SIGTERM); #endif #ifdef SIGUSR1 SETSIG("USR1", SIGUSR1); #endif #ifdef SIGUSR2 SETSIG("USR2", SIGUSR2); #endif #ifdef SIGCONT SETSIG("CONT", SIGCONT); #endif #ifdef SIGSTOP SETSIG("STOP", SIGSTOP); #endif #ifdef SIGTSTP SETSIG("TSTP", SIGTSTP); #endif p = strtok(NULL, ":,"); } #endif /* SIG_IGN */ free(str); }