sig.c revision 28679
1217309Snwhitehorn/*-
2217309Snwhitehorn * Copyright (c) 1997
3217309Snwhitehorn *	Brian Somers <brian@awfulhak.demon.co.uk>.  All rights reserved.
4217309Snwhitehorn *
5217309Snwhitehorn * Redistribution and use in source and binary forms, with or without
6217309Snwhitehorn * modification, are permitted provided that the following conditions
7217309Snwhitehorn * are met:
8217309Snwhitehorn * 1. Redistributions of source code must retain the above copyright
9217309Snwhitehorn *    notice, this list of conditions and the following disclaimer.
10217309Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright
11217309Snwhitehorn *    notice, this list of conditions and the following disclaimer in the
12217309Snwhitehorn *    documentation and/or other materials provided with the distribution.
13217309Snwhitehorn * 3. Neither the name of the University nor the names of its contributors
14217309Snwhitehorn *    may be used to endorse or promote products derived from this software
15217309Snwhitehorn *    without specific prior written permission.
16217309Snwhitehorn *
17217309Snwhitehorn * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
18217309Snwhitehorn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19217309Snwhitehorn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20217309Snwhitehorn * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $Id: sig.c,v 1.7 1997/06/09 03:27:36 brian Exp $
30 *
31 *  TODO:
32 *
33 */
34
35#include "sig.h"
36#include <sys/types.h>
37#include <signal.h>
38#include "mbuf.h"
39#include "log.h"
40
41static caused[NSIG];		/* An array of pending signals */
42static sig_type handler[NSIG];	/* all start at SIG_DFL */
43
44
45/* Record a signal in the "caused" array */
46
47static void
48signal_recorder(int sig)
49{
50  caused[sig - 1]++;
51}
52
53
54/*
55 * Set up signal_recorder, and record handler as the function to ultimately
56 * call in handle_signal()
57*/
58
59sig_type
60pending_signal(int sig, sig_type fn)
61{
62  sig_type Result;
63
64  if (sig <= 0 || sig > NSIG) {
65    /* Oops - we must be a bit out of date (too many sigs ?) */
66    LogPrintf(LogALERT, "Eeek! %s:%s: I must be out of date!\n",
67	      __FILE__, __LINE__);
68    return signal(sig, fn);
69  }
70  Result = handler[sig - 1];
71  if (fn == SIG_DFL || fn == SIG_IGN) {
72    signal(sig, fn);
73    handler[sig - 1] = (sig_type) 0;
74  } else {
75    handler[sig - 1] = fn;
76    signal(sig, signal_recorder);
77  }
78  caused[sig - 1] = 0;
79  return Result;
80}
81
82
83/* Call the handlers for any pending signals */
84
85void
86handle_signals()
87{
88  int sig;
89  int got;
90
91  do {
92    got = 0;
93    for (sig = 0; sig < NSIG; sig++)
94      if (caused[sig]) {
95	caused[sig]--;
96	got++;
97	(*handler[sig]) (sig + 1);
98      }
99  } while (got);
100}
101