#include <signal.h> #include <stdio.h> #include "config.h" #include "lint.h" extern int interupted; static struct sig_disp { int sig; char *name; } disp[] = { {SIGHUP, "HUP"}, {SIGINT, "INT"}, {SIGQUIT, "QUIT"}, {SIGTERM, "TERM"}, {SIGUSR1, "USR1"}, {SIGUSR2, "USR2"}, {SIGTSTP, "TSTP"}, {SIGCONT, "CONT"}, {0, "UNKNOWN"}, }; static int pending_signals = 0; static void sig_handler(int sig) { int i; for (i = 0; disp[i].sig && disp[i].sig != sig; i++) ; pending_signals |= 1<<(i); interupted = 1; #if defined(SYSV) || defined(LINUX) signal(sig, sig_handler); #endif } void init_signals() { int i; for (i = 0; disp[i].sig; i++) signal(disp[i].sig, sig_handler); } void deliver_signals() { int i; for (i = 0; pending_signals; i++) { if (pending_signals & (1<<i)) { pending_signals &= ~(1<<i); /* deliver the signal */ push_constant_string(disp[i].name); apply_master_ob(M_EXTERNAL_SIGNAL, 1); } } }