1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 1987 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*      Copyright (c) 1984 AT&T */
28/*        All Rights Reserved   */
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"  /* from S5R2 1.2 */
31
32/*LINTLIBRARY*/
33/*
34 *	ssignal, gsignal: software signals
35 */
36#include <signal.h>
37
38/* Highest allowable user signal number */
39#define	MAXSIG NSIG
40
41/* Lowest allowable signal number (lowest user number is always 1) */
42#define	MINSIG (-4)
43
44/* Table of signal values */
45typedef int (*sigfunc)();
46sigfunc *ssigp;
47
48
49sigfunc *
50_ssig()
51{
52	if (ssigp == 0)
53		ssigp = (sigfunc *)calloc(MAXSIG-MINSIG+1, sizeof (sigfunc));
54	return (ssigp);
55}
56
57int
58(*ssignal(sig, fn))()
59register int sig, (*fn)();
60{
61	register int (*savefn)();
62	register sigfunc *sp = _ssig();
63
64	if (sp == 0)
65		return ((int (*)())SIG_DFL);
66	if (sig >= MINSIG && sig <= MAXSIG) {
67		savefn = sp[sig-MINSIG];
68		sp[sig-MINSIG] = fn;
69	} else
70		savefn = (int (*)())SIG_DFL;
71
72	return (savefn);
73}
74
75int
76gsignal(sig)
77register int sig;
78{
79	register int (*sigfn)();
80	register sigfunc *sp = _ssig();
81
82	if (sp == 0)
83		return (0);
84	if (sig < MINSIG || sig > MAXSIG ||
85				(sigfn = sp[sig-MINSIG]) == (int (*)())SIG_DFL)
86		return (0);
87	else if (sigfn == (int (*)())SIG_IGN)
88		return (1);
89	else {
90		sp[sig-MINSIG] = (int (*)())SIG_DFL;
91		return ((*sigfn)(sig));
92	}
93}
94