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