1*6eef5f0cSAntonio Huete Jimenez /* NAME:
2*6eef5f0cSAntonio Huete Jimenez * sigact.c - fake sigaction(2)
3*6eef5f0cSAntonio Huete Jimenez *
4*6eef5f0cSAntonio Huete Jimenez * SYNOPSIS:
5*6eef5f0cSAntonio Huete Jimenez * #include "sigact.h"
6*6eef5f0cSAntonio Huete Jimenez *
7*6eef5f0cSAntonio Huete Jimenez * int sigaction(int sig, struct sigaction *act,
8*6eef5f0cSAntonio Huete Jimenez * struct sigaction *oact);
9*6eef5f0cSAntonio Huete Jimenez * int sigaddset(sigset_t *mask, int sig);
10*6eef5f0cSAntonio Huete Jimenez * int sigdelset(sigset_t *mask, int sig);
11*6eef5f0cSAntonio Huete Jimenez * int sigemptyset(sigset_t *mask);
12*6eef5f0cSAntonio Huete Jimenez * int sigfillset(sigset_t *mask);
13*6eef5f0cSAntonio Huete Jimenez * int sigismember(sigset_t *mask, int sig);
14*6eef5f0cSAntonio Huete Jimenez * int sigpending(sigset_t *set);
15*6eef5f0cSAntonio Huete Jimenez * int sigprocmask(int how, sigset_t *set, sigset_t *oset);
16*6eef5f0cSAntonio Huete Jimenez * int sigsuspend(sigset_t *mask);
17*6eef5f0cSAntonio Huete Jimenez *
18*6eef5f0cSAntonio Huete Jimenez * SIG_HDLR (*Signal(int sig, SIG_HDLR (*disp)(int)))(int);
19*6eef5f0cSAntonio Huete Jimenez *
20*6eef5f0cSAntonio Huete Jimenez * DESCRIPTION:
21*6eef5f0cSAntonio Huete Jimenez * This is a fake sigaction implementation. It uses
22*6eef5f0cSAntonio Huete Jimenez * sigsetmask(2) et al or sigset(2) and friends if
23*6eef5f0cSAntonio Huete Jimenez * available, otherwise it just uses signal(2). If it
24*6eef5f0cSAntonio Huete Jimenez * thinks sigaction(2) really exists it compiles to "almost"
25*6eef5f0cSAntonio Huete Jimenez * nothing.
26*6eef5f0cSAntonio Huete Jimenez *
27*6eef5f0cSAntonio Huete Jimenez * In any case it provides a Signal() function that is
28*6eef5f0cSAntonio Huete Jimenez * implemented in terms of sigaction().
29*6eef5f0cSAntonio Huete Jimenez * If not using signal(2) as part of the underlying
30*6eef5f0cSAntonio Huete Jimenez * implementation (USE_SIGNAL or USE_SIGMASK), and
31*6eef5f0cSAntonio Huete Jimenez * NO_SIGNAL is not defined, it also provides a signal()
32*6eef5f0cSAntonio Huete Jimenez * function that calls Signal().
33*6eef5f0cSAntonio Huete Jimenez *
34*6eef5f0cSAntonio Huete Jimenez * The need for all this mucking about is the problems
35*6eef5f0cSAntonio Huete Jimenez * caused by mixing various signal handling mechanisms in
36*6eef5f0cSAntonio Huete Jimenez * the one process. This module allows for a consistent
37*6eef5f0cSAntonio Huete Jimenez * POSIX compliant interface to whatever is actually
38*6eef5f0cSAntonio Huete Jimenez * available.
39*6eef5f0cSAntonio Huete Jimenez *
40*6eef5f0cSAntonio Huete Jimenez * sigaction() allows the caller to examine and/or set the
41*6eef5f0cSAntonio Huete Jimenez * action to be associated with a given signal. "act" and
42*6eef5f0cSAntonio Huete Jimenez * "oact" are pointers to 'sigaction structs':
43*6eef5f0cSAntonio Huete Jimenez *.nf
44*6eef5f0cSAntonio Huete Jimenez *
45*6eef5f0cSAntonio Huete Jimenez * struct sigaction
46*6eef5f0cSAntonio Huete Jimenez * {
47*6eef5f0cSAntonio Huete Jimenez * SIG_HDLR (*sa_handler)();
48*6eef5f0cSAntonio Huete Jimenez * sigset_t sa_mask;
49*6eef5f0cSAntonio Huete Jimenez * int sa_flags;
50*6eef5f0cSAntonio Huete Jimenez * };
51*6eef5f0cSAntonio Huete Jimenez *.fi
52*6eef5f0cSAntonio Huete Jimenez *
53*6eef5f0cSAntonio Huete Jimenez * SIG_HDLR is normally 'void' in the POSIX implementation
54*6eef5f0cSAntonio Huete Jimenez * and for most current systems. On some older UNIX
55*6eef5f0cSAntonio Huete Jimenez * systems, signal handlers do not return 'void', so
56*6eef5f0cSAntonio Huete Jimenez * this implementation keeps 'sa_handler' inline with the
57*6eef5f0cSAntonio Huete Jimenez * hosts normal signal handling conventions.
58*6eef5f0cSAntonio Huete Jimenez * 'sa_mask' controls which signals will be blocked while
59*6eef5f0cSAntonio Huete Jimenez * the selected signal handler is active. It is not used
60*6eef5f0cSAntonio Huete Jimenez * in this implementation.
61*6eef5f0cSAntonio Huete Jimenez * 'sa_flags' controls various semantics such as whether
62*6eef5f0cSAntonio Huete Jimenez * system calls should be automagically restarted
63*6eef5f0cSAntonio Huete Jimenez * (SA_RESTART) etc. It is not used in this
64*6eef5f0cSAntonio Huete Jimenez * implementation.
65*6eef5f0cSAntonio Huete Jimenez * Either "act" or "oact" may be NULL in which case the
66*6eef5f0cSAntonio Huete Jimenez * appropriate operation is skipped.
67*6eef5f0cSAntonio Huete Jimenez *
68*6eef5f0cSAntonio Huete Jimenez * sigaddset() adds "sig" to the sigset_t pointed to by "mask".
69*6eef5f0cSAntonio Huete Jimenez *
70*6eef5f0cSAntonio Huete Jimenez * sigdelset() removes "sig" from the sigset_t pointed to
71*6eef5f0cSAntonio Huete Jimenez * by "mask".
72*6eef5f0cSAntonio Huete Jimenez *
73*6eef5f0cSAntonio Huete Jimenez * sigemptyset() makes the sigset_t pointed to by "mask" empty.
74*6eef5f0cSAntonio Huete Jimenez *
75*6eef5f0cSAntonio Huete Jimenez * sigfillset() makes the sigset_t pointed to by "mask"
76*6eef5f0cSAntonio Huete Jimenez * full ie. match all signals.
77*6eef5f0cSAntonio Huete Jimenez *
78*6eef5f0cSAntonio Huete Jimenez * sigismember() returns true if "sig" is found in "*mask".
79*6eef5f0cSAntonio Huete Jimenez *
80*6eef5f0cSAntonio Huete Jimenez * sigpending() is supposed to return "set" loaded with the
81*6eef5f0cSAntonio Huete Jimenez * set of signals that are blocked and pending for the
82*6eef5f0cSAntonio Huete Jimenez * calling process. It does nothing in this impementation.
83*6eef5f0cSAntonio Huete Jimenez *
84*6eef5f0cSAntonio Huete Jimenez * sigprocmask() is used to examine and/or change the
85*6eef5f0cSAntonio Huete Jimenez * signal mask for the calling process. Either "set" or
86*6eef5f0cSAntonio Huete Jimenez * "oset" may be NULL in which case the appropriate
87*6eef5f0cSAntonio Huete Jimenez * operation is skipped. "how" may be one of SIG_BLOCK,
88*6eef5f0cSAntonio Huete Jimenez * SIG_UNBLOCK or SIG_SETMASK. If this package is built
89*6eef5f0cSAntonio Huete Jimenez * with USE_SIGNAL, then this routine achieves nothing.
90*6eef5f0cSAntonio Huete Jimenez *
91*6eef5f0cSAntonio Huete Jimenez * sigsuspend() sets the signal mask to "*mask" and waits
92*6eef5f0cSAntonio Huete Jimenez * for a signal to be delivered after which the previous
93*6eef5f0cSAntonio Huete Jimenez * mask is restored.
94*6eef5f0cSAntonio Huete Jimenez *
95*6eef5f0cSAntonio Huete Jimenez *
96*6eef5f0cSAntonio Huete Jimenez * RETURN VALUE:
97*6eef5f0cSAntonio Huete Jimenez * 0==success, -1==failure
98*6eef5f0cSAntonio Huete Jimenez *
99*6eef5f0cSAntonio Huete Jimenez * BUGS:
100*6eef5f0cSAntonio Huete Jimenez * Since we fake most of this, don't expect fancy usage to
101*6eef5f0cSAntonio Huete Jimenez * work.
102*6eef5f0cSAntonio Huete Jimenez *
103*6eef5f0cSAntonio Huete Jimenez * AUTHOR:
104*6eef5f0cSAntonio Huete Jimenez * Simon J. Gerraty <sjg@crufty.net>
105*6eef5f0cSAntonio Huete Jimenez */
106*6eef5f0cSAntonio Huete Jimenez /* COPYRIGHT:
107*6eef5f0cSAntonio Huete Jimenez * @(#)Copyright (c) 1992-2021, Simon J. Gerraty
108*6eef5f0cSAntonio Huete Jimenez *
109*6eef5f0cSAntonio Huete Jimenez * This is free software. It comes with NO WARRANTY.
110*6eef5f0cSAntonio Huete Jimenez * Permission to use, modify and distribute this source code
111*6eef5f0cSAntonio Huete Jimenez * is granted subject to the following conditions.
112*6eef5f0cSAntonio Huete Jimenez * 1/ that that the above copyright notice and this notice
113*6eef5f0cSAntonio Huete Jimenez * are preserved in all copies and that due credit be given
114*6eef5f0cSAntonio Huete Jimenez * to the author.
115*6eef5f0cSAntonio Huete Jimenez * 2/ that any changes to this code are clearly commented
116*6eef5f0cSAntonio Huete Jimenez * as such so that the author does get blamed for bugs
117*6eef5f0cSAntonio Huete Jimenez * other than his own.
118*6eef5f0cSAntonio Huete Jimenez *
119*6eef5f0cSAntonio Huete Jimenez * Please send copies of changes and bug-fixes to:
120*6eef5f0cSAntonio Huete Jimenez * sjg@crufty.net
121*6eef5f0cSAntonio Huete Jimenez *
122*6eef5f0cSAntonio Huete Jimenez */
123*6eef5f0cSAntonio Huete Jimenez #ifndef lint
124*6eef5f0cSAntonio Huete Jimenez static char *RCSid = "$Id: sigact.c,v 1.8 2021/10/14 19:39:17 sjg Exp $";
125*6eef5f0cSAntonio Huete Jimenez #endif
126*6eef5f0cSAntonio Huete Jimenez
127*6eef5f0cSAntonio Huete Jimenez #undef _ANSI_SOURCE /* causes problems */
128*6eef5f0cSAntonio Huete Jimenez
129*6eef5f0cSAntonio Huete Jimenez #include <signal.h>
130*6eef5f0cSAntonio Huete Jimenez #include <sys/cdefs.h>
131*6eef5f0cSAntonio Huete Jimenez
132*6eef5f0cSAntonio Huete Jimenez #ifdef HAVE_CONFIG_H
133*6eef5f0cSAntonio Huete Jimenez # include "config.h"
134*6eef5f0cSAntonio Huete Jimenez # ifdef NO_SIGSET
135*6eef5f0cSAntonio Huete Jimenez # undef HAVE_SIGSET
136*6eef5f0cSAntonio Huete Jimenez # endif
137*6eef5f0cSAntonio Huete Jimenez # ifndef HAVE_SIGACTION
138*6eef5f0cSAntonio Huete Jimenez # ifdef HAVE_SIGSETMASK
139*6eef5f0cSAntonio Huete Jimenez # define USE_SIGMASK
140*6eef5f0cSAntonio Huete Jimenez # else
141*6eef5f0cSAntonio Huete Jimenez # ifdef HAVE_SIGSET
142*6eef5f0cSAntonio Huete Jimenez # define USE_SIGSET
143*6eef5f0cSAntonio Huete Jimenez # else
144*6eef5f0cSAntonio Huete Jimenez # define USE_SIGNAL
145*6eef5f0cSAntonio Huete Jimenez # endif
146*6eef5f0cSAntonio Huete Jimenez # endif
147*6eef5f0cSAntonio Huete Jimenez # endif
148*6eef5f0cSAntonio Huete Jimenez #endif
149*6eef5f0cSAntonio Huete Jimenez
150*6eef5f0cSAntonio Huete Jimenez /*
151*6eef5f0cSAntonio Huete Jimenez * some systems have a faulty sigaction() implementation!
152*6eef5f0cSAntonio Huete Jimenez * Allow us to bypass it.
153*6eef5f0cSAntonio Huete Jimenez * Or they may have installed sigact.h as signal.h which is why
154*6eef5f0cSAntonio Huete Jimenez * we have SA_NOCLDSTOP defined.
155*6eef5f0cSAntonio Huete Jimenez */
156*6eef5f0cSAntonio Huete Jimenez #if !defined(SA_NOCLDSTOP) || defined(_SIGACT_H) || defined(USE_SIGNAL) || defined(USE_SIGSET) || defined(USE_SIGMASK)
157*6eef5f0cSAntonio Huete Jimenez
158*6eef5f0cSAntonio Huete Jimenez /*
159*6eef5f0cSAntonio Huete Jimenez * if we haven't been told,
160*6eef5f0cSAntonio Huete Jimenez * try and guess what we should implement with.
161*6eef5f0cSAntonio Huete Jimenez */
162*6eef5f0cSAntonio Huete Jimenez #if !defined(USE_SIGSET) && !defined(USE_SIGMASK) && !defined(USE_SIGNAL)
163*6eef5f0cSAntonio Huete Jimenez # if defined(sigmask) || defined(BSD) || defined(_BSD) && !defined(BSD41)
164*6eef5f0cSAntonio Huete Jimenez # define USE_SIGMASK
165*6eef5f0cSAntonio Huete Jimenez # else
166*6eef5f0cSAntonio Huete Jimenez # ifndef NO_SIGSET
167*6eef5f0cSAntonio Huete Jimenez # define USE_SIGSET
168*6eef5f0cSAntonio Huete Jimenez # else
169*6eef5f0cSAntonio Huete Jimenez # define USE_SIGNAL
170*6eef5f0cSAntonio Huete Jimenez # endif
171*6eef5f0cSAntonio Huete Jimenez # endif
172*6eef5f0cSAntonio Huete Jimenez #endif
173*6eef5f0cSAntonio Huete Jimenez /*
174*6eef5f0cSAntonio Huete Jimenez * if we still don't know, we're in trouble
175*6eef5f0cSAntonio Huete Jimenez */
176*6eef5f0cSAntonio Huete Jimenez #if !defined(USE_SIGSET) && !defined(USE_SIGMASK) && !defined(USE_SIGNAL)
177*6eef5f0cSAntonio Huete Jimenez error must know what to implement with
178*6eef5f0cSAntonio Huete Jimenez #endif
179*6eef5f0cSAntonio Huete Jimenez
180*6eef5f0cSAntonio Huete Jimenez #include "sigact.h"
181*6eef5f0cSAntonio Huete Jimenez
182*6eef5f0cSAntonio Huete Jimenez /*
183*6eef5f0cSAntonio Huete Jimenez * in case signal() has been mapped to our Signal().
184*6eef5f0cSAntonio Huete Jimenez */
185*6eef5f0cSAntonio Huete Jimenez #undef signal
186*6eef5f0cSAntonio Huete Jimenez
187*6eef5f0cSAntonio Huete Jimenez
188*6eef5f0cSAntonio Huete Jimenez int
sigaction(int sig,const struct sigaction * act,struct sigaction * oact)189*6eef5f0cSAntonio Huete Jimenez sigaction(int sig,
190*6eef5f0cSAntonio Huete Jimenez const struct sigaction *act,
191*6eef5f0cSAntonio Huete Jimenez struct sigaction *oact)
192*6eef5f0cSAntonio Huete Jimenez {
193*6eef5f0cSAntonio Huete Jimenez SIG_HDLR(*oldh) ();
194*6eef5f0cSAntonio Huete Jimenez
195*6eef5f0cSAntonio Huete Jimenez if (act) {
196*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGSET
197*6eef5f0cSAntonio Huete Jimenez oldh = sigset(sig, act->sa_handler);
198*6eef5f0cSAntonio Huete Jimenez #else
199*6eef5f0cSAntonio Huete Jimenez oldh = signal(sig, act->sa_handler);
200*6eef5f0cSAntonio Huete Jimenez #endif
201*6eef5f0cSAntonio Huete Jimenez } else {
202*6eef5f0cSAntonio Huete Jimenez if (oact) {
203*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGSET
204*6eef5f0cSAntonio Huete Jimenez oldh = sigset(sig, SIG_IGN);
205*6eef5f0cSAntonio Huete Jimenez #else
206*6eef5f0cSAntonio Huete Jimenez oldh = signal(sig, SIG_IGN);
207*6eef5f0cSAntonio Huete Jimenez #endif
208*6eef5f0cSAntonio Huete Jimenez if (oldh != SIG_IGN && oldh != SIG_ERR) {
209*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGSET
210*6eef5f0cSAntonio Huete Jimenez (void) sigset(sig, oldh);
211*6eef5f0cSAntonio Huete Jimenez #else
212*6eef5f0cSAntonio Huete Jimenez (void) signal(sig, oldh);
213*6eef5f0cSAntonio Huete Jimenez #endif
214*6eef5f0cSAntonio Huete Jimenez }
215*6eef5f0cSAntonio Huete Jimenez }
216*6eef5f0cSAntonio Huete Jimenez }
217*6eef5f0cSAntonio Huete Jimenez if (oact) {
218*6eef5f0cSAntonio Huete Jimenez oact->sa_handler = oldh;
219*6eef5f0cSAntonio Huete Jimenez }
220*6eef5f0cSAntonio Huete Jimenez return 0; /* hey we're faking it */
221*6eef5f0cSAntonio Huete Jimenez }
222*6eef5f0cSAntonio Huete Jimenez
223*6eef5f0cSAntonio Huete Jimenez #ifndef HAVE_SIGADDSET
224*6eef5f0cSAntonio Huete Jimenez int
sigaddset(sigset_t * mask,int sig)225*6eef5f0cSAntonio Huete Jimenez sigaddset(sigset_t *mask, int sig)
226*6eef5f0cSAntonio Huete Jimenez {
227*6eef5f0cSAntonio Huete Jimenez *mask |= sigmask(sig);
228*6eef5f0cSAntonio Huete Jimenez return 0;
229*6eef5f0cSAntonio Huete Jimenez }
230*6eef5f0cSAntonio Huete Jimenez
231*6eef5f0cSAntonio Huete Jimenez
232*6eef5f0cSAntonio Huete Jimenez int
sigdelset(sigset_t * mask,int sig)233*6eef5f0cSAntonio Huete Jimenez sigdelset(sigset_t *mask, int sig)
234*6eef5f0cSAntonio Huete Jimenez {
235*6eef5f0cSAntonio Huete Jimenez *mask &= ~(sigmask(sig));
236*6eef5f0cSAntonio Huete Jimenez return 0;
237*6eef5f0cSAntonio Huete Jimenez }
238*6eef5f0cSAntonio Huete Jimenez
239*6eef5f0cSAntonio Huete Jimenez
240*6eef5f0cSAntonio Huete Jimenez int
sigemptyset(sigset_t * mask)241*6eef5f0cSAntonio Huete Jimenez sigemptyset(sigset_t *mask)
242*6eef5f0cSAntonio Huete Jimenez {
243*6eef5f0cSAntonio Huete Jimenez *mask = 0;
244*6eef5f0cSAntonio Huete Jimenez return 0;
245*6eef5f0cSAntonio Huete Jimenez }
246*6eef5f0cSAntonio Huete Jimenez
247*6eef5f0cSAntonio Huete Jimenez
248*6eef5f0cSAntonio Huete Jimenez int
sigfillset(sigset_t * mask)249*6eef5f0cSAntonio Huete Jimenez sigfillset(sigset_t *mask)
250*6eef5f0cSAntonio Huete Jimenez {
251*6eef5f0cSAntonio Huete Jimenez *mask = ~0;
252*6eef5f0cSAntonio Huete Jimenez return 0;
253*6eef5f0cSAntonio Huete Jimenez }
254*6eef5f0cSAntonio Huete Jimenez
255*6eef5f0cSAntonio Huete Jimenez
256*6eef5f0cSAntonio Huete Jimenez int
sigismember(const sigset_t * mask,int sig)257*6eef5f0cSAntonio Huete Jimenez sigismember(const sigset_t *mask, int sig)
258*6eef5f0cSAntonio Huete Jimenez {
259*6eef5f0cSAntonio Huete Jimenez return ((*mask) & sigmask(sig));
260*6eef5f0cSAntonio Huete Jimenez }
261*6eef5f0cSAntonio Huete Jimenez #endif
262*6eef5f0cSAntonio Huete Jimenez
263*6eef5f0cSAntonio Huete Jimenez #ifndef HAVE_SIGPENDING
264*6eef5f0cSAntonio Huete Jimenez int
sigpending(sigset_t * set)265*6eef5f0cSAntonio Huete Jimenez sigpending(sigset_t *set)
266*6eef5f0cSAntonio Huete Jimenez {
267*6eef5f0cSAntonio Huete Jimenez return 0; /* faking it! */
268*6eef5f0cSAntonio Huete Jimenez }
269*6eef5f0cSAntonio Huete Jimenez #endif
270*6eef5f0cSAntonio Huete Jimenez
271*6eef5f0cSAntonio Huete Jimenez #ifndef HAVE_SIGPROCMASK
272*6eef5f0cSAntonio Huete Jimenez int
sigprocmask(int how,const sigset_t * set,sigset_t * oset)273*6eef5f0cSAntonio Huete Jimenez sigprocmask(int how, const sigset_t *set, sigset_t *oset)
274*6eef5f0cSAntonio Huete Jimenez {
275*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGSET
276*6eef5f0cSAntonio Huete Jimenez int i;
277*6eef5f0cSAntonio Huete Jimenez #endif
278*6eef5f0cSAntonio Huete Jimenez static sigset_t sm;
279*6eef5f0cSAntonio Huete Jimenez static int once = 0;
280*6eef5f0cSAntonio Huete Jimenez
281*6eef5f0cSAntonio Huete Jimenez if (!once) {
282*6eef5f0cSAntonio Huete Jimenez /*
283*6eef5f0cSAntonio Huete Jimenez * initally we clear sm,
284*6eef5f0cSAntonio Huete Jimenez * there after, it represents the last
285*6eef5f0cSAntonio Huete Jimenez * thing we did.
286*6eef5f0cSAntonio Huete Jimenez */
287*6eef5f0cSAntonio Huete Jimenez once++;
288*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGMASK
289*6eef5f0cSAntonio Huete Jimenez sm = sigblock(0);
290*6eef5f0cSAntonio Huete Jimenez #else
291*6eef5f0cSAntonio Huete Jimenez sm = 0;
292*6eef5f0cSAntonio Huete Jimenez #endif
293*6eef5f0cSAntonio Huete Jimenez }
294*6eef5f0cSAntonio Huete Jimenez if (oset)
295*6eef5f0cSAntonio Huete Jimenez *oset = sm;
296*6eef5f0cSAntonio Huete Jimenez if (set) {
297*6eef5f0cSAntonio Huete Jimenez switch (how) {
298*6eef5f0cSAntonio Huete Jimenez case SIG_BLOCK:
299*6eef5f0cSAntonio Huete Jimenez sm |= *set;
300*6eef5f0cSAntonio Huete Jimenez break;
301*6eef5f0cSAntonio Huete Jimenez case SIG_UNBLOCK:
302*6eef5f0cSAntonio Huete Jimenez sm &= ~(*set);
303*6eef5f0cSAntonio Huete Jimenez break;
304*6eef5f0cSAntonio Huete Jimenez case SIG_SETMASK:
305*6eef5f0cSAntonio Huete Jimenez sm = *set;
306*6eef5f0cSAntonio Huete Jimenez break;
307*6eef5f0cSAntonio Huete Jimenez }
308*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGMASK
309*6eef5f0cSAntonio Huete Jimenez (void) sigsetmask(sm);
310*6eef5f0cSAntonio Huete Jimenez #else
311*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGSET
312*6eef5f0cSAntonio Huete Jimenez for (i = 1; i < NSIG; i++) {
313*6eef5f0cSAntonio Huete Jimenez if (how == SIG_UNBLOCK) {
314*6eef5f0cSAntonio Huete Jimenez if (*set & sigmask(i))
315*6eef5f0cSAntonio Huete Jimenez sigrelse(i);
316*6eef5f0cSAntonio Huete Jimenez } else
317*6eef5f0cSAntonio Huete Jimenez if (sm & sigmask(i)) {
318*6eef5f0cSAntonio Huete Jimenez sighold(i);
319*6eef5f0cSAntonio Huete Jimenez }
320*6eef5f0cSAntonio Huete Jimenez }
321*6eef5f0cSAntonio Huete Jimenez #endif
322*6eef5f0cSAntonio Huete Jimenez #endif
323*6eef5f0cSAntonio Huete Jimenez }
324*6eef5f0cSAntonio Huete Jimenez return 0;
325*6eef5f0cSAntonio Huete Jimenez }
326*6eef5f0cSAntonio Huete Jimenez #endif
327*6eef5f0cSAntonio Huete Jimenez
328*6eef5f0cSAntonio Huete Jimenez #ifndef HAVE_SIGSUSPEND
329*6eef5f0cSAntonio Huete Jimenez int
sigsuspend(sigset_t * mask)330*6eef5f0cSAntonio Huete Jimenez sigsuspend(sigset_t *mask)
331*6eef5f0cSAntonio Huete Jimenez {
332*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGMASK
333*6eef5f0cSAntonio Huete Jimenez sigpause(*mask);
334*6eef5f0cSAntonio Huete Jimenez #else
335*6eef5f0cSAntonio Huete Jimenez int i;
336*6eef5f0cSAntonio Huete Jimenez
337*6eef5f0cSAntonio Huete Jimenez #ifdef USE_SIGSET
338*6eef5f0cSAntonio Huete Jimenez
339*6eef5f0cSAntonio Huete Jimenez for (i = 1; i < NSIG; i++) {
340*6eef5f0cSAntonio Huete Jimenez if (*mask & sigmask(i)) {
341*6eef5f0cSAntonio Huete Jimenez /* not the same sigpause() as above! */
342*6eef5f0cSAntonio Huete Jimenez sigpause(i);
343*6eef5f0cSAntonio Huete Jimenez break;
344*6eef5f0cSAntonio Huete Jimenez }
345*6eef5f0cSAntonio Huete Jimenez }
346*6eef5f0cSAntonio Huete Jimenez #else /* signal(2) only */
347*6eef5f0cSAntonio Huete Jimenez SIG_HDLR(*oldh) ();
348*6eef5f0cSAntonio Huete Jimenez
349*6eef5f0cSAntonio Huete Jimenez /*
350*6eef5f0cSAntonio Huete Jimenez * make sure that signals in mask will not
351*6eef5f0cSAntonio Huete Jimenez * be ignored.
352*6eef5f0cSAntonio Huete Jimenez */
353*6eef5f0cSAntonio Huete Jimenez for (i = 1; i < NSIG; i++) {
354*6eef5f0cSAntonio Huete Jimenez if (*mask & sigmask(i)) {
355*6eef5f0cSAntonio Huete Jimenez if ((oldh = signal(i, SIG_DFL)) != SIG_ERR &&
356*6eef5f0cSAntonio Huete Jimenez oldh != SIG_IGN &&
357*6eef5f0cSAntonio Huete Jimenez oldh != SIG_DFL)
358*6eef5f0cSAntonio Huete Jimenez (void) signal(i, oldh); /* restore handler */
359*6eef5f0cSAntonio Huete Jimenez }
360*6eef5f0cSAntonio Huete Jimenez }
361*6eef5f0cSAntonio Huete Jimenez pause(); /* wait for a signal */
362*6eef5f0cSAntonio Huete Jimenez #endif
363*6eef5f0cSAntonio Huete Jimenez #endif
364*6eef5f0cSAntonio Huete Jimenez return 0;
365*6eef5f0cSAntonio Huete Jimenez }
366*6eef5f0cSAntonio Huete Jimenez #endif
367*6eef5f0cSAntonio Huete Jimenez #endif /* ! SA_NOCLDSTOP */
368*6eef5f0cSAntonio Huete Jimenez
369*6eef5f0cSAntonio Huete Jimenez #if 0
370*6eef5f0cSAntonio Huete Jimenez #if !defined(SIG_HDLR)
371*6eef5f0cSAntonio Huete Jimenez #define SIG_HDLR void
372*6eef5f0cSAntonio Huete Jimenez #endif
373*6eef5f0cSAntonio Huete Jimenez #if !defined(SIG_ERR)
374*6eef5f0cSAntonio Huete Jimenez #define SIG_ERR (SIG_HDLR (*)())-1
375*6eef5f0cSAntonio Huete Jimenez #endif
376*6eef5f0cSAntonio Huete Jimenez
377*6eef5f0cSAntonio Huete Jimenez #if !defined(USE_SIGNAL) && !defined(USE_SIGMASK) && !defined(NO_SIGNAL)
378*6eef5f0cSAntonio Huete Jimenez /*
379*6eef5f0cSAntonio Huete Jimenez * ensure we avoid signal mayhem
380*6eef5f0cSAntonio Huete Jimenez */
381*6eef5f0cSAntonio Huete Jimenez
382*6eef5f0cSAntonio Huete Jimenez extern void (*Signal (int sig, void (*handler) (int)))(int);
383*6eef5f0cSAntonio Huete Jimenez
384*6eef5f0cSAntonio Huete Jimenez SIG_HDLR(*signal(int sig, SIG_HDLR(*handler)(int))
385*6eef5f0cSAntonio Huete Jimenez {
386*6eef5f0cSAntonio Huete Jimenez return (Signal(sig, handler));
387*6eef5f0cSAntonio Huete Jimenez }
388*6eef5f0cSAntonio Huete Jimenez #endif
389*6eef5f0cSAntonio Huete Jimenez #endif
390*6eef5f0cSAntonio Huete Jimenez
391*6eef5f0cSAntonio Huete Jimenez /* This lot (for GNU-Emacs) goes at the end of the file. */
392*6eef5f0cSAntonio Huete Jimenez /*
393*6eef5f0cSAntonio Huete Jimenez * Local Variables:
394*6eef5f0cSAntonio Huete Jimenez * version-control:t
395*6eef5f0cSAntonio Huete Jimenez * comment-column:40
396*6eef5f0cSAntonio Huete Jimenez * End:
397*6eef5f0cSAntonio Huete Jimenez */
398