sig.c revision 31343
130715Sbrian/* 231343Sbrian * $Id: sig.c,v 1.9 1997/10/26 01:03:42 brian Exp $ 323840Sbrian */ 423840Sbrian 523840Sbrian#include <sys/types.h> 630715Sbrian 723840Sbrian#include <signal.h> 830715Sbrian 931343Sbrian#include "command.h" 1023840Sbrian#include "mbuf.h" 1123840Sbrian#include "log.h" 1231343Sbrian#include "sig.h" 1323840Sbrian 1423840Sbrianstatic caused[NSIG]; /* An array of pending signals */ 1523840Sbrianstatic sig_type handler[NSIG]; /* all start at SIG_DFL */ 1623840Sbrian 1723840Sbrian 1823840Sbrian/* Record a signal in the "caused" array */ 1923840Sbrian 2028679Sbrianstatic void 2128679Sbriansignal_recorder(int sig) 2228679Sbrian{ 2328679Sbrian caused[sig - 1]++; 2423840Sbrian} 2523840Sbrian 2623840Sbrian 2723840Sbrian/* 2828679Sbrian * Set up signal_recorder, and record handler as the function to ultimately 2928679Sbrian * call in handle_signal() 3023840Sbrian*/ 3123840Sbrian 3228679Sbriansig_type 3328679Sbrianpending_signal(int sig, sig_type fn) 3428679Sbrian{ 3528679Sbrian sig_type Result; 3623840Sbrian 3728679Sbrian if (sig <= 0 || sig > NSIG) { 3828679Sbrian /* Oops - we must be a bit out of date (too many sigs ?) */ 3928679Sbrian LogPrintf(LogALERT, "Eeek! %s:%s: I must be out of date!\n", 4028679Sbrian __FILE__, __LINE__); 4128679Sbrian return signal(sig, fn); 4228679Sbrian } 4328679Sbrian Result = handler[sig - 1]; 4428679Sbrian if (fn == SIG_DFL || fn == SIG_IGN) { 4528679Sbrian signal(sig, fn); 4628679Sbrian handler[sig - 1] = (sig_type) 0; 4728679Sbrian } else { 4828679Sbrian handler[sig - 1] = fn; 4928679Sbrian signal(sig, signal_recorder); 5028679Sbrian } 5128679Sbrian caused[sig - 1] = 0; 5228679Sbrian return Result; 5323840Sbrian} 5423840Sbrian 5523840Sbrian 5623840Sbrian/* Call the handlers for any pending signals */ 5723840Sbrian 5828679Sbrianvoid 5928679Sbrianhandle_signals() 6028679Sbrian{ 6128679Sbrian int sig; 6228679Sbrian int got; 6323840Sbrian 6428679Sbrian do { 6528679Sbrian got = 0; 6628679Sbrian for (sig = 0; sig < NSIG; sig++) 6728679Sbrian if (caused[sig]) { 6828679Sbrian caused[sig]--; 6928679Sbrian got++; 7028679Sbrian (*handler[sig]) (sig + 1); 7128679Sbrian } 7228679Sbrian } while (got); 7323840Sbrian} 74