#include <config.h>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
#include "missing.h"
int
sigaction(signo, sa, osa)
int signo;
const sigaction_t *sa;
sigaction_t *osa;
{
sigaction_t nsa;
int error;
if (sa) {
nsa = *sa;
nsa.sa_flags ^= SV_INTERRUPT;
sa = &nsa;
}
error = sigvec(signo, sa, osa);
if (!error && osa)
osa->sa_flags ^= SV_INTERRUPT;
return error;
}
int
sigemptyset(set)
sigset_t *set;
{
*set = 0;
return 0;
}
int
sigfillset(set)
sigset_t *set;
{
*set = ~0;;
return 0;
}
int
sigaddset(set, signo)
sigset_t *set;
int signo;
{
if (signo <= 0 || signo >= NSIG) {
errno = EINVAL;
return -1;
}
SET(*set, sigmask(signo));
return 0;
}
int
sigdelset(set, signo)
sigset_t *set;
int signo;
{
if (signo <= 0 || signo >= NSIG) {
errno = EINVAL;
return -1;
}
CLR(*set, sigmask(signo));
return 0;
}
int
sigismember(set, signo)
sigset_t *set;
int signo;
{
return ISSET(*set, sigmask(signo));
}
int
sigprocmask(how, set, oset)
int how;
const sigset_t *set;
sigset_t *oset;
{
int mask;
if (set == 0)
mask = sigblock(0);
else
switch (how) {
case SIG_BLOCK:
mask = sigblock(*set);
break;
case SIG_UNBLOCK:
mask = sigsetmask(sigblock(0) & ~(*set));
break;
case SIG_SETMASK:
mask = sigsetmask(*set);
break;
default:
return -1;
}
if (mask == -1)
return -1;
if (oset)
*oset = mask;
return 0;
}