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