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