#include <signal.h>
#include <errno.h>
#include <compat.h>
#ifndef lint
static const char rcsid[] = "$Sudo: sigaction.c,v 1.5 2004/02/13 21:36:43 millert Exp $";
#endif
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(~*set);
break;
case SIG_SETMASK:
mask = sigsetmask(*set);
break;
default:
return(-1);
}
if (mask == -1)
return(-1);
if (oset)
*oset = mask;
return(0);
}