xref: /titanic_50/usr/src/cmd/sendmail/libsm/signal.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
3*7c478bd9Sstevel@tonic-gate  *      All rights reserved.
4*7c478bd9Sstevel@tonic-gate  *
5*7c478bd9Sstevel@tonic-gate  * By using this file, you agree to the terms and conditions set
6*7c478bd9Sstevel@tonic-gate  * forth in the LICENSE file which can be found at the top level of
7*7c478bd9Sstevel@tonic-gate  * the sendmail distribution.
8*7c478bd9Sstevel@tonic-gate  */
9*7c478bd9Sstevel@tonic-gate 
10*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
11*7c478bd9Sstevel@tonic-gate 
12*7c478bd9Sstevel@tonic-gate #include <sm/gen.h>
13*7c478bd9Sstevel@tonic-gate SM_RCSID("@(#)$Id: signal.c,v 1.13 2001/08/14 16:05:47 ca Exp $")
14*7c478bd9Sstevel@tonic-gate 
15*7c478bd9Sstevel@tonic-gate #if SM_CONF_SETITIMER
16*7c478bd9Sstevel@tonic-gate # include <sys/time.h>
17*7c478bd9Sstevel@tonic-gate #endif /* SM_CONF_SETITIMER */
18*7c478bd9Sstevel@tonic-gate #include <errno.h>
19*7c478bd9Sstevel@tonic-gate #include <stdlib.h>
20*7c478bd9Sstevel@tonic-gate #include <time.h>
21*7c478bd9Sstevel@tonic-gate #include <unistd.h>
22*7c478bd9Sstevel@tonic-gate #include <sm/clock.h>
23*7c478bd9Sstevel@tonic-gate #include <sm/signal.h>
24*7c478bd9Sstevel@tonic-gate #include <signal.h>
25*7c478bd9Sstevel@tonic-gate #include <sm/string.h>
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate unsigned int	volatile InCriticalSection; /* >0 if inside critical section */
28*7c478bd9Sstevel@tonic-gate int		volatile PendingSignal;	/* pending signal to resend */
29*7c478bd9Sstevel@tonic-gate 
30*7c478bd9Sstevel@tonic-gate /*
31*7c478bd9Sstevel@tonic-gate **  SM_SIGNAL -- set a signal handler
32*7c478bd9Sstevel@tonic-gate **
33*7c478bd9Sstevel@tonic-gate **	This is essentially old BSD "signal(3)".
34*7c478bd9Sstevel@tonic-gate **
35*7c478bd9Sstevel@tonic-gate **	NOTE:	THIS CAN BE CALLED FROM A SIGNAL HANDLER.  DO NOT ADD
36*7c478bd9Sstevel@tonic-gate **		ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
37*7c478bd9Sstevel@tonic-gate **		DOING.
38*7c478bd9Sstevel@tonic-gate */
39*7c478bd9Sstevel@tonic-gate 
40*7c478bd9Sstevel@tonic-gate sigfunc_t
41*7c478bd9Sstevel@tonic-gate sm_signal(sig, handler)
42*7c478bd9Sstevel@tonic-gate 	int sig;
43*7c478bd9Sstevel@tonic-gate 	sigfunc_t handler;
44*7c478bd9Sstevel@tonic-gate {
45*7c478bd9Sstevel@tonic-gate # if defined(SA_RESTART) || (!defined(SYS5SIGNALS) && !defined(BSD4_3))
46*7c478bd9Sstevel@tonic-gate 	struct sigaction n, o;
47*7c478bd9Sstevel@tonic-gate # endif /* defined(SA_RESTART) || (!defined(SYS5SIGNALS) && !defined(BSD4_3)) */
48*7c478bd9Sstevel@tonic-gate 
49*7c478bd9Sstevel@tonic-gate 	/*
50*7c478bd9Sstevel@tonic-gate 	**  First, try for modern signal calls
51*7c478bd9Sstevel@tonic-gate 	**  and restartable syscalls
52*7c478bd9Sstevel@tonic-gate 	*/
53*7c478bd9Sstevel@tonic-gate 
54*7c478bd9Sstevel@tonic-gate # ifdef SA_RESTART
55*7c478bd9Sstevel@tonic-gate 	(void) memset(&n, '\0', sizeof n);
56*7c478bd9Sstevel@tonic-gate #  if USE_SA_SIGACTION
57*7c478bd9Sstevel@tonic-gate 	n.sa_sigaction = (void(*)(int, siginfo_t *, void *)) handler;
58*7c478bd9Sstevel@tonic-gate 	n.sa_flags = SA_RESTART|SA_SIGINFO;
59*7c478bd9Sstevel@tonic-gate #  else /* USE_SA_SIGACTION */
60*7c478bd9Sstevel@tonic-gate 	n.sa_handler = handler;
61*7c478bd9Sstevel@tonic-gate 	n.sa_flags = SA_RESTART;
62*7c478bd9Sstevel@tonic-gate #  endif /* USE_SA_SIGACTION */
63*7c478bd9Sstevel@tonic-gate 	if (sigaction(sig, &n, &o) < 0)
64*7c478bd9Sstevel@tonic-gate 		return SIG_ERR;
65*7c478bd9Sstevel@tonic-gate 	return o.sa_handler;
66*7c478bd9Sstevel@tonic-gate # else /* SA_RESTART */
67*7c478bd9Sstevel@tonic-gate 
68*7c478bd9Sstevel@tonic-gate 	/*
69*7c478bd9Sstevel@tonic-gate 	**  Else check for SYS5SIGNALS or
70*7c478bd9Sstevel@tonic-gate 	**  BSD4_3 signals
71*7c478bd9Sstevel@tonic-gate 	*/
72*7c478bd9Sstevel@tonic-gate 
73*7c478bd9Sstevel@tonic-gate #  if defined(SYS5SIGNALS) || defined(BSD4_3)
74*7c478bd9Sstevel@tonic-gate #   ifdef BSD4_3
75*7c478bd9Sstevel@tonic-gate 	return signal(sig, handler);
76*7c478bd9Sstevel@tonic-gate #   else /* BSD4_3 */
77*7c478bd9Sstevel@tonic-gate 	return sigset(sig, handler);
78*7c478bd9Sstevel@tonic-gate #   endif /* BSD4_3 */
79*7c478bd9Sstevel@tonic-gate #  else /* defined(SYS5SIGNALS) || defined(BSD4_3) */
80*7c478bd9Sstevel@tonic-gate 
81*7c478bd9Sstevel@tonic-gate 	/*
82*7c478bd9Sstevel@tonic-gate 	**  Finally, if nothing else is available,
83*7c478bd9Sstevel@tonic-gate 	**  go for a default
84*7c478bd9Sstevel@tonic-gate 	*/
85*7c478bd9Sstevel@tonic-gate 
86*7c478bd9Sstevel@tonic-gate 	(void) memset(&n, '\0', sizeof n);
87*7c478bd9Sstevel@tonic-gate 	n.sa_handler = handler;
88*7c478bd9Sstevel@tonic-gate 	if (sigaction(sig, &n, &o) < 0)
89*7c478bd9Sstevel@tonic-gate 		return SIG_ERR;
90*7c478bd9Sstevel@tonic-gate 	return o.sa_handler;
91*7c478bd9Sstevel@tonic-gate #  endif /* defined(SYS5SIGNALS) || defined(BSD4_3) */
92*7c478bd9Sstevel@tonic-gate # endif /* SA_RESTART */
93*7c478bd9Sstevel@tonic-gate }
94*7c478bd9Sstevel@tonic-gate /*
95*7c478bd9Sstevel@tonic-gate **  SM_BLOCKSIGNAL -- hold a signal to prevent delivery
96*7c478bd9Sstevel@tonic-gate **
97*7c478bd9Sstevel@tonic-gate **	Parameters:
98*7c478bd9Sstevel@tonic-gate **		sig -- the signal to block.
99*7c478bd9Sstevel@tonic-gate **
100*7c478bd9Sstevel@tonic-gate **	Returns:
101*7c478bd9Sstevel@tonic-gate **		1 signal was previously blocked
102*7c478bd9Sstevel@tonic-gate **		0 signal was not previously blocked
103*7c478bd9Sstevel@tonic-gate **		-1 on failure.
104*7c478bd9Sstevel@tonic-gate */
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate int
107*7c478bd9Sstevel@tonic-gate sm_blocksignal(sig)
108*7c478bd9Sstevel@tonic-gate 	int sig;
109*7c478bd9Sstevel@tonic-gate {
110*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3
111*7c478bd9Sstevel@tonic-gate #  ifndef sigmask
112*7c478bd9Sstevel@tonic-gate #   define sigmask(s)	(1 << ((s) - 1))
113*7c478bd9Sstevel@tonic-gate #  endif /* ! sigmask */
114*7c478bd9Sstevel@tonic-gate 	return (sigblock(sigmask(sig)) & sigmask(sig)) != 0;
115*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */
116*7c478bd9Sstevel@tonic-gate #  ifdef ALTOS_SYSTEM_V
117*7c478bd9Sstevel@tonic-gate 	sigfunc_t handler;
118*7c478bd9Sstevel@tonic-gate 
119*7c478bd9Sstevel@tonic-gate 	handler = sigset(sig, SIG_HOLD);
120*7c478bd9Sstevel@tonic-gate 	if (handler == SIG_ERR)
121*7c478bd9Sstevel@tonic-gate 		return -1;
122*7c478bd9Sstevel@tonic-gate 	else
123*7c478bd9Sstevel@tonic-gate 		return handler == SIG_HOLD;
124*7c478bd9Sstevel@tonic-gate #  else /* ALTOS_SYSTEM_V */
125*7c478bd9Sstevel@tonic-gate 	sigset_t sset, oset;
126*7c478bd9Sstevel@tonic-gate 
127*7c478bd9Sstevel@tonic-gate 	(void) sigemptyset(&sset);
128*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, sig);
129*7c478bd9Sstevel@tonic-gate 	if (sigprocmask(SIG_BLOCK, &sset, &oset) < 0)
130*7c478bd9Sstevel@tonic-gate 		return -1;
131*7c478bd9Sstevel@tonic-gate 	else
132*7c478bd9Sstevel@tonic-gate 		return sigismember(&oset, sig);
133*7c478bd9Sstevel@tonic-gate #  endif /* ALTOS_SYSTEM_V */
134*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */
135*7c478bd9Sstevel@tonic-gate }
136*7c478bd9Sstevel@tonic-gate /*
137*7c478bd9Sstevel@tonic-gate **  SM_RELEASESIGNAL -- release a held signal
138*7c478bd9Sstevel@tonic-gate **
139*7c478bd9Sstevel@tonic-gate **	Parameters:
140*7c478bd9Sstevel@tonic-gate **		sig -- the signal to release.
141*7c478bd9Sstevel@tonic-gate **
142*7c478bd9Sstevel@tonic-gate **	Returns:
143*7c478bd9Sstevel@tonic-gate **		1 signal was previously blocked
144*7c478bd9Sstevel@tonic-gate **		0 signal was not previously blocked
145*7c478bd9Sstevel@tonic-gate **		-1 on failure.
146*7c478bd9Sstevel@tonic-gate */
147*7c478bd9Sstevel@tonic-gate 
148*7c478bd9Sstevel@tonic-gate int
149*7c478bd9Sstevel@tonic-gate sm_releasesignal(sig)
150*7c478bd9Sstevel@tonic-gate 	int sig;
151*7c478bd9Sstevel@tonic-gate {
152*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3
153*7c478bd9Sstevel@tonic-gate 	return (sigsetmask(sigblock(0) & ~sigmask(sig)) & sigmask(sig)) != 0;
154*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */
155*7c478bd9Sstevel@tonic-gate #  ifdef ALTOS_SYSTEM_V
156*7c478bd9Sstevel@tonic-gate 	sigfunc_t handler;
157*7c478bd9Sstevel@tonic-gate 
158*7c478bd9Sstevel@tonic-gate 	handler = sigset(sig, SIG_HOLD);
159*7c478bd9Sstevel@tonic-gate 	if (sigrelse(sig) < 0)
160*7c478bd9Sstevel@tonic-gate 		return -1;
161*7c478bd9Sstevel@tonic-gate 	else
162*7c478bd9Sstevel@tonic-gate 		return handler == SIG_HOLD;
163*7c478bd9Sstevel@tonic-gate #  else /* ALTOS_SYSTEM_V */
164*7c478bd9Sstevel@tonic-gate 	sigset_t sset, oset;
165*7c478bd9Sstevel@tonic-gate 
166*7c478bd9Sstevel@tonic-gate 	(void) sigemptyset(&sset);
167*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, sig);
168*7c478bd9Sstevel@tonic-gate 	if (sigprocmask(SIG_UNBLOCK, &sset, &oset) < 0)
169*7c478bd9Sstevel@tonic-gate 		return -1;
170*7c478bd9Sstevel@tonic-gate 	else
171*7c478bd9Sstevel@tonic-gate 		return sigismember(&oset, sig);
172*7c478bd9Sstevel@tonic-gate #  endif /* ALTOS_SYSTEM_V */
173*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */
174*7c478bd9Sstevel@tonic-gate }
175*7c478bd9Sstevel@tonic-gate /*
176*7c478bd9Sstevel@tonic-gate **  PEND_SIGNAL -- Add a signal to the pending signal list
177*7c478bd9Sstevel@tonic-gate **
178*7c478bd9Sstevel@tonic-gate **	Parameters:
179*7c478bd9Sstevel@tonic-gate **		sig -- signal to add
180*7c478bd9Sstevel@tonic-gate **
181*7c478bd9Sstevel@tonic-gate **	Returns:
182*7c478bd9Sstevel@tonic-gate **		none.
183*7c478bd9Sstevel@tonic-gate **
184*7c478bd9Sstevel@tonic-gate **	NOTE:	THIS CAN BE CALLED FROM A SIGNAL HANDLER.  DO NOT ADD
185*7c478bd9Sstevel@tonic-gate **		ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
186*7c478bd9Sstevel@tonic-gate **		DOING.
187*7c478bd9Sstevel@tonic-gate */
188*7c478bd9Sstevel@tonic-gate 
189*7c478bd9Sstevel@tonic-gate void
190*7c478bd9Sstevel@tonic-gate pend_signal(sig)
191*7c478bd9Sstevel@tonic-gate 	int sig;
192*7c478bd9Sstevel@tonic-gate {
193*7c478bd9Sstevel@tonic-gate 	int sigbit;
194*7c478bd9Sstevel@tonic-gate 	int save_errno = errno;
195*7c478bd9Sstevel@tonic-gate #if SM_CONF_SETITIMER
196*7c478bd9Sstevel@tonic-gate 	struct itimerval clr;
197*7c478bd9Sstevel@tonic-gate #endif /* SM_CONF_SETITIMER */
198*7c478bd9Sstevel@tonic-gate 
199*7c478bd9Sstevel@tonic-gate 	/*
200*7c478bd9Sstevel@tonic-gate 	**  Don't want to interrupt something critical, hence delay
201*7c478bd9Sstevel@tonic-gate 	**  the alarm for one second.  Hopefully, by then we
202*7c478bd9Sstevel@tonic-gate 	**  will be out of the critical section.  If not, then
203*7c478bd9Sstevel@tonic-gate 	**  we will just delay again.  The events to be run will
204*7c478bd9Sstevel@tonic-gate 	**  still all be run, maybe just a little bit late.
205*7c478bd9Sstevel@tonic-gate 	*/
206*7c478bd9Sstevel@tonic-gate 
207*7c478bd9Sstevel@tonic-gate 	switch (sig)
208*7c478bd9Sstevel@tonic-gate 	{
209*7c478bd9Sstevel@tonic-gate 	  case SIGHUP:
210*7c478bd9Sstevel@tonic-gate 		sigbit = PEND_SIGHUP;
211*7c478bd9Sstevel@tonic-gate 		break;
212*7c478bd9Sstevel@tonic-gate 
213*7c478bd9Sstevel@tonic-gate 	  case SIGINT:
214*7c478bd9Sstevel@tonic-gate 		sigbit = PEND_SIGINT;
215*7c478bd9Sstevel@tonic-gate 		break;
216*7c478bd9Sstevel@tonic-gate 
217*7c478bd9Sstevel@tonic-gate 	  case SIGTERM:
218*7c478bd9Sstevel@tonic-gate 		sigbit = PEND_SIGTERM;
219*7c478bd9Sstevel@tonic-gate 		break;
220*7c478bd9Sstevel@tonic-gate 
221*7c478bd9Sstevel@tonic-gate 	  case SIGUSR1:
222*7c478bd9Sstevel@tonic-gate 		sigbit = PEND_SIGUSR1;
223*7c478bd9Sstevel@tonic-gate 		break;
224*7c478bd9Sstevel@tonic-gate 
225*7c478bd9Sstevel@tonic-gate 	  case SIGALRM:
226*7c478bd9Sstevel@tonic-gate 		/* don't have to pend these */
227*7c478bd9Sstevel@tonic-gate 		sigbit = 0;
228*7c478bd9Sstevel@tonic-gate 		break;
229*7c478bd9Sstevel@tonic-gate 
230*7c478bd9Sstevel@tonic-gate 	  default:
231*7c478bd9Sstevel@tonic-gate 		/* If we get here, we are in trouble */
232*7c478bd9Sstevel@tonic-gate 		abort();
233*7c478bd9Sstevel@tonic-gate 
234*7c478bd9Sstevel@tonic-gate 		/* NOTREACHED */
235*7c478bd9Sstevel@tonic-gate 		/* shut up stupid compiler warning on HP-UX 11 */
236*7c478bd9Sstevel@tonic-gate 		sigbit = 0;
237*7c478bd9Sstevel@tonic-gate 		break;
238*7c478bd9Sstevel@tonic-gate 	}
239*7c478bd9Sstevel@tonic-gate 
240*7c478bd9Sstevel@tonic-gate 	if (sigbit != 0)
241*7c478bd9Sstevel@tonic-gate 		PendingSignal |= sigbit;
242*7c478bd9Sstevel@tonic-gate 	(void) sm_signal(SIGALRM, sm_tick);
243*7c478bd9Sstevel@tonic-gate #if SM_CONF_SETITIMER
244*7c478bd9Sstevel@tonic-gate 	clr.it_interval.tv_sec = 0;
245*7c478bd9Sstevel@tonic-gate 	clr.it_interval.tv_usec = 0;
246*7c478bd9Sstevel@tonic-gate 	clr.it_value.tv_sec = 1;
247*7c478bd9Sstevel@tonic-gate 	clr.it_value.tv_usec = 0;
248*7c478bd9Sstevel@tonic-gate 	(void) setitimer(ITIMER_REAL, &clr, NULL);
249*7c478bd9Sstevel@tonic-gate #else /* SM_CONF_SETITIMER */
250*7c478bd9Sstevel@tonic-gate 	(void) alarm(1);
251*7c478bd9Sstevel@tonic-gate #endif /* SM_CONF_SETITIMER */
252*7c478bd9Sstevel@tonic-gate 	errno = save_errno;
253*7c478bd9Sstevel@tonic-gate }
254*7c478bd9Sstevel@tonic-gate /*
255*7c478bd9Sstevel@tonic-gate **  SM_ALLSIGNALS -- act on all signals
256*7c478bd9Sstevel@tonic-gate **
257*7c478bd9Sstevel@tonic-gate **	Parameters:
258*7c478bd9Sstevel@tonic-gate **		block -- whether to block or release all signals.
259*7c478bd9Sstevel@tonic-gate **
260*7c478bd9Sstevel@tonic-gate **	Returns:
261*7c478bd9Sstevel@tonic-gate **		none.
262*7c478bd9Sstevel@tonic-gate */
263*7c478bd9Sstevel@tonic-gate 
264*7c478bd9Sstevel@tonic-gate void
265*7c478bd9Sstevel@tonic-gate sm_allsignals(block)
266*7c478bd9Sstevel@tonic-gate 	bool block;
267*7c478bd9Sstevel@tonic-gate {
268*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3
269*7c478bd9Sstevel@tonic-gate #  ifndef sigmask
270*7c478bd9Sstevel@tonic-gate #   define sigmask(s)	(1 << ((s) - 1))
271*7c478bd9Sstevel@tonic-gate #  endif /* ! sigmask */
272*7c478bd9Sstevel@tonic-gate 	if (block)
273*7c478bd9Sstevel@tonic-gate 	{
274*7c478bd9Sstevel@tonic-gate 		int mask = 0;
275*7c478bd9Sstevel@tonic-gate 
276*7c478bd9Sstevel@tonic-gate 		mask |= sigmask(SIGALRM);
277*7c478bd9Sstevel@tonic-gate 		mask |= sigmask(SIGCHLD);
278*7c478bd9Sstevel@tonic-gate 		mask |= sigmask(SIGHUP);
279*7c478bd9Sstevel@tonic-gate 		mask |= sigmask(SIGINT);
280*7c478bd9Sstevel@tonic-gate 		mask |= sigmask(SIGTERM);
281*7c478bd9Sstevel@tonic-gate 		mask |= sigmask(SIGUSR1);
282*7c478bd9Sstevel@tonic-gate 
283*7c478bd9Sstevel@tonic-gate 		(void) sigblock(mask);
284*7c478bd9Sstevel@tonic-gate 	}
285*7c478bd9Sstevel@tonic-gate 	else
286*7c478bd9Sstevel@tonic-gate 		sigsetmask(0);
287*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */
288*7c478bd9Sstevel@tonic-gate #  ifdef ALTOS_SYSTEM_V
289*7c478bd9Sstevel@tonic-gate 	if (block)
290*7c478bd9Sstevel@tonic-gate 	{
291*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGALRM, SIG_HOLD);
292*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGCHLD, SIG_HOLD);
293*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGHUP, SIG_HOLD);
294*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGINT, SIG_HOLD);
295*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGTERM, SIG_HOLD);
296*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGUSR1, SIG_HOLD);
297*7c478bd9Sstevel@tonic-gate 	}
298*7c478bd9Sstevel@tonic-gate 	else
299*7c478bd9Sstevel@tonic-gate 	{
300*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGALRM, SIG_DFL);
301*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGCHLD, SIG_DFL);
302*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGHUP, SIG_DFL);
303*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGINT, SIG_DFL);
304*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGTERM, SIG_DFL);
305*7c478bd9Sstevel@tonic-gate 		(void) sigset(SIGUSR1, SIG_DFL);
306*7c478bd9Sstevel@tonic-gate 	}
307*7c478bd9Sstevel@tonic-gate #  else /* ALTOS_SYSTEM_V */
308*7c478bd9Sstevel@tonic-gate 	sigset_t sset;
309*7c478bd9Sstevel@tonic-gate 
310*7c478bd9Sstevel@tonic-gate 	(void) sigemptyset(&sset);
311*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, SIGALRM);
312*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, SIGCHLD);
313*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, SIGHUP);
314*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, SIGINT);
315*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, SIGTERM);
316*7c478bd9Sstevel@tonic-gate 	(void) sigaddset(&sset, SIGUSR1);
317*7c478bd9Sstevel@tonic-gate 	(void) sigprocmask(block ? SIG_BLOCK : SIG_UNBLOCK, &sset, NULL);
318*7c478bd9Sstevel@tonic-gate #  endif /* ALTOS_SYSTEM_V */
319*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */
320*7c478bd9Sstevel@tonic-gate }
321*7c478bd9Sstevel@tonic-gate /*
322*7c478bd9Sstevel@tonic-gate **  SM_SIGNAL_NOOP -- A signal no-op function
323*7c478bd9Sstevel@tonic-gate **
324*7c478bd9Sstevel@tonic-gate **	Parameters:
325*7c478bd9Sstevel@tonic-gate **		sig -- signal received
326*7c478bd9Sstevel@tonic-gate **
327*7c478bd9Sstevel@tonic-gate **	Returns:
328*7c478bd9Sstevel@tonic-gate **		SIGFUNC_RETURN
329*7c478bd9Sstevel@tonic-gate */
330*7c478bd9Sstevel@tonic-gate 
331*7c478bd9Sstevel@tonic-gate /* ARGSUSED */
332*7c478bd9Sstevel@tonic-gate SIGFUNC_DECL
333*7c478bd9Sstevel@tonic-gate sm_signal_noop(sig)
334*7c478bd9Sstevel@tonic-gate 	int sig;
335*7c478bd9Sstevel@tonic-gate {
336*7c478bd9Sstevel@tonic-gate 	int save_errno = errno;
337*7c478bd9Sstevel@tonic-gate 
338*7c478bd9Sstevel@tonic-gate 	FIX_SYSV_SIGNAL(sig, sm_signal_noop);
339*7c478bd9Sstevel@tonic-gate 	errno = save_errno;
340*7c478bd9Sstevel@tonic-gate 	return SIGFUNC_RETURN;
341*7c478bd9Sstevel@tonic-gate }
342*7c478bd9Sstevel@tonic-gate 
343