xref: /dflybsd-src/contrib/bmake/sigaction.c (revision 9e7ae5a0527a977cab412aede3a532cfe2903bbb)
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