xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/posix_signals.c (revision 41fbaed053f8fbfdf9d2a4ee0a7386a3c83f8505)
1*41fbaed0Stron /*	$NetBSD: posix_signals.c,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $	*/
2*41fbaed0Stron 
3*41fbaed0Stron /*++
4*41fbaed0Stron /* NAME
5*41fbaed0Stron /*	posix_signals 3
6*41fbaed0Stron /* SUMMARY
7*41fbaed0Stron /*	POSIX signal handling compatibility
8*41fbaed0Stron /* SYNOPSIS
9*41fbaed0Stron /*	#include <posix_signals.h>
10*41fbaed0Stron /*
11*41fbaed0Stron /*	int	sigemptyset(m)
12*41fbaed0Stron /*	sigset_t *m;
13*41fbaed0Stron /*
14*41fbaed0Stron /*	int	sigaddset(set, signum)
15*41fbaed0Stron /*	sigset_t *set;
16*41fbaed0Stron /*	int	signum;
17*41fbaed0Stron /*
18*41fbaed0Stron /*	int	sigprocmask(how, set, old)
19*41fbaed0Stron /*	int	how;
20*41fbaed0Stron /*	sigset_t *set;
21*41fbaed0Stron /*	sigset_t *old;
22*41fbaed0Stron /*
23*41fbaed0Stron /*	int	sigaction(sig, act, oact)
24*41fbaed0Stron /*	int	sig;
25*41fbaed0Stron /*	struct sigaction *act;
26*41fbaed0Stron /*	struct sigaction *oact;
27*41fbaed0Stron /* DESCRIPTION
28*41fbaed0Stron /*	These routines emulate the POSIX signal handling interface.
29*41fbaed0Stron /* AUTHOR(S)
30*41fbaed0Stron /*	Pieter Schoenmakers
31*41fbaed0Stron /*	Eindhoven University of Technology
32*41fbaed0Stron /*	P.O. Box 513
33*41fbaed0Stron /*	5600 MB Eindhoven
34*41fbaed0Stron /*	The Netherlands
35*41fbaed0Stron /*--*/
36*41fbaed0Stron 
37*41fbaed0Stron /* System library. */
38*41fbaed0Stron 
39*41fbaed0Stron #include "sys_defs.h"
40*41fbaed0Stron #include <signal.h>
41*41fbaed0Stron #include <errno.h>
42*41fbaed0Stron 
43*41fbaed0Stron /* Utility library.*/
44*41fbaed0Stron 
45*41fbaed0Stron #include "posix_signals.h"
46*41fbaed0Stron 
47*41fbaed0Stron #ifdef MISSING_SIGSET_T
48*41fbaed0Stron 
sigemptyset(sigset_t * m)49*41fbaed0Stron int     sigemptyset(sigset_t *m)
50*41fbaed0Stron {
51*41fbaed0Stron     return *m = 0;
52*41fbaed0Stron }
53*41fbaed0Stron 
sigaddset(sigset_t * set,int signum)54*41fbaed0Stron int     sigaddset(sigset_t *set, int signum)
55*41fbaed0Stron {
56*41fbaed0Stron     *set |= sigmask(signum);
57*41fbaed0Stron     return 0;
58*41fbaed0Stron }
59*41fbaed0Stron 
sigprocmask(int how,sigset_t * set,sigset_t * old)60*41fbaed0Stron int     sigprocmask(int how, sigset_t *set, sigset_t *old)
61*41fbaed0Stron {
62*41fbaed0Stron     int previous;
63*41fbaed0Stron 
64*41fbaed0Stron     if (how == SIG_BLOCK)
65*41fbaed0Stron 	previous = sigblock(*set);
66*41fbaed0Stron     else if (how == SIG_SETMASK)
67*41fbaed0Stron 	previous = sigsetmask(*set);
68*41fbaed0Stron     else if (how == SIG_UNBLOCK) {
69*41fbaed0Stron 	int     m = sigblock(0);
70*41fbaed0Stron 
71*41fbaed0Stron 	previous = sigsetmask(m & ~*set);
72*41fbaed0Stron     } else {
73*41fbaed0Stron 	errno = EINVAL;
74*41fbaed0Stron 	return -1;
75*41fbaed0Stron     }
76*41fbaed0Stron 
77*41fbaed0Stron     if (old)
78*41fbaed0Stron 	*old = previous;
79*41fbaed0Stron     return 0;
80*41fbaed0Stron }
81*41fbaed0Stron 
82*41fbaed0Stron #endif
83*41fbaed0Stron 
84*41fbaed0Stron #ifdef MISSING_SIGACTION
85*41fbaed0Stron 
86*41fbaed0Stron static struct sigaction actions[NSIG] = {};
87*41fbaed0Stron 
sighandle(int signum)88*41fbaed0Stron static int sighandle(int signum)
89*41fbaed0Stron {
90*41fbaed0Stron     if (signum == SIGCHLD) {
91*41fbaed0Stron 	/* XXX If the child is just stopped, don't invoke the handler.	 */
92*41fbaed0Stron     }
93*41fbaed0Stron     actions[signum].sa_handler(signum);
94*41fbaed0Stron }
95*41fbaed0Stron 
sigaction(int sig,struct sigaction * act,struct sigaction * oact)96*41fbaed0Stron int     sigaction(int sig, struct sigaction *act, struct sigaction *oact)
97*41fbaed0Stron {
98*41fbaed0Stron     static int initialized = 0;
99*41fbaed0Stron 
100*41fbaed0Stron     if (!initialized) {
101*41fbaed0Stron 	int     i;
102*41fbaed0Stron 
103*41fbaed0Stron 	for (i = 0; i < NSIG; i++)
104*41fbaed0Stron 	    actions[i].sa_handler = SIG_DFL;
105*41fbaed0Stron 	initialized = 1;
106*41fbaed0Stron     }
107*41fbaed0Stron     if (sig <= 0 || sig >= NSIG) {
108*41fbaed0Stron 	errno = EINVAL;
109*41fbaed0Stron 	return -1;
110*41fbaed0Stron     }
111*41fbaed0Stron     if (oact)
112*41fbaed0Stron 	*oact = actions[sig];
113*41fbaed0Stron 
114*41fbaed0Stron     {
115*41fbaed0Stron 	struct sigvec mine = {
116*41fbaed0Stron 	    sighandle, act->sa_mask,
117*41fbaed0Stron 	    act->sa_flags & SA_RESTART ? SV_INTERRUPT : 0
118*41fbaed0Stron 	};
119*41fbaed0Stron 
120*41fbaed0Stron 	if (sigvec(sig, &mine, NULL))
121*41fbaed0Stron 	    return -1;
122*41fbaed0Stron     }
123*41fbaed0Stron 
124*41fbaed0Stron     actions[sig] = *act;
125*41fbaed0Stron     return 0;
126*41fbaed0Stron }
127*41fbaed0Stron 
128*41fbaed0Stron #endif
129