xref: /plan9/sys/src/ape/lib/ap/posix/sigset.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <signal.h>
2*3e12c5d1SDavid du Colombier #include <errno.h>
3*3e12c5d1SDavid du Colombier 
4*3e12c5d1SDavid du Colombier /*
5*3e12c5d1SDavid du Colombier  * sigsets are 32-bit longs.  if the 2<<(i-1) bit is on,
6*3e12c5d1SDavid du Colombier  * the signal #define'd as i in signal.h is inluded.
7*3e12c5d1SDavid du Colombier  */
8*3e12c5d1SDavid du Colombier 
9*3e12c5d1SDavid du Colombier static sigset_t stdsigs = SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGABRT|SIGFPE|SIGKILL|
10*3e12c5d1SDavid du Colombier 		SIGSEGV|SIGPIPE|SIGALRM|SIGTERM|SIGUSR1|SIGUSR2;
11*3e12c5d1SDavid du Colombier 
12*3e12c5d1SDavid du Colombier #define BITSIG(s) (2<<(s))
13*3e12c5d1SDavid du Colombier 
14*3e12c5d1SDavid du Colombier int
sigemptyset(sigset_t * set)15*3e12c5d1SDavid du Colombier sigemptyset(sigset_t *set)
16*3e12c5d1SDavid du Colombier {
17*3e12c5d1SDavid du Colombier 	*set = 0;
18*3e12c5d1SDavid du Colombier 	return 0;
19*3e12c5d1SDavid du Colombier }
20*3e12c5d1SDavid du Colombier 
21*3e12c5d1SDavid du Colombier int
sigfillset(sigset_t * set)22*3e12c5d1SDavid du Colombier sigfillset(sigset_t *set)
23*3e12c5d1SDavid du Colombier {
24*3e12c5d1SDavid du Colombier 	*set = stdsigs;
25*3e12c5d1SDavid du Colombier 	return 0;
26*3e12c5d1SDavid du Colombier }
27*3e12c5d1SDavid du Colombier 
28*3e12c5d1SDavid du Colombier int
sigaddset(sigset_t * set,int signo)29*3e12c5d1SDavid du Colombier sigaddset(sigset_t *set, int signo)
30*3e12c5d1SDavid du Colombier {
31*3e12c5d1SDavid du Colombier 	int b;
32*3e12c5d1SDavid du Colombier 
33*3e12c5d1SDavid du Colombier 	b = BITSIG(signo);
34*3e12c5d1SDavid du Colombier 	if(!(b&stdsigs)){
35*3e12c5d1SDavid du Colombier 		errno = EINVAL;
36*3e12c5d1SDavid du Colombier 		return -1;
37*3e12c5d1SDavid du Colombier 	}
38*3e12c5d1SDavid du Colombier 	*set |= b;
39*3e12c5d1SDavid du Colombier 	return 0;
40*3e12c5d1SDavid du Colombier }
41*3e12c5d1SDavid du Colombier 
42*3e12c5d1SDavid du Colombier int
sigdelset(sigset_t * set,int signo)43*3e12c5d1SDavid du Colombier sigdelset(sigset_t *set, int signo)
44*3e12c5d1SDavid du Colombier {
45*3e12c5d1SDavid du Colombier 	int b;
46*3e12c5d1SDavid du Colombier 
47*3e12c5d1SDavid du Colombier 	b = BITSIG(signo);
48*3e12c5d1SDavid du Colombier 	if(!(b&stdsigs)){
49*3e12c5d1SDavid du Colombier 		errno = EINVAL;
50*3e12c5d1SDavid du Colombier 		return -1;
51*3e12c5d1SDavid du Colombier 	}
52*3e12c5d1SDavid du Colombier 	*set &= ~b;
53*3e12c5d1SDavid du Colombier 	return 0;
54*3e12c5d1SDavid du Colombier }
55*3e12c5d1SDavid du Colombier 
56*3e12c5d1SDavid du Colombier int
sigismember(sigset_t * set,int signo)57*3e12c5d1SDavid du Colombier sigismember(sigset_t *set, int signo)
58*3e12c5d1SDavid du Colombier {
59*3e12c5d1SDavid du Colombier 	int b;
60*3e12c5d1SDavid du Colombier 
61*3e12c5d1SDavid du Colombier 	b = BITSIG(signo);
62*3e12c5d1SDavid du Colombier 	if(!(b&stdsigs)){
63*3e12c5d1SDavid du Colombier 		errno = EINVAL;
64*3e12c5d1SDavid du Colombier 		return -1;
65*3e12c5d1SDavid du Colombier 	}
66*3e12c5d1SDavid du Colombier 	return (b&*set)? 1 : 0;
67*3e12c5d1SDavid du Colombier }
68