/*
 * Copyright (c) 2001-2005 Todd C. Miller <Todd.Miller@courtesan.com>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Sponsored in part by the Defense Advanced Research Projects
 * Agency (DARPA) and Air Force Research Laboratory, Air Force
 * Materiel Command, USAF, under agreement number F39502-99-1-0512.
 */

#include <signal.h>
#include <errno.h>

#include <compat.h>

int
sigaction(signo, sa, osa)
    int signo;
    const sigaction_t *sa;
    sigaction_t *osa;
{
    sigaction_t nsa;
    int error;

    /* We must reverse SV_INTERRUPT since it is the opposite of SA_RESTART */
    if (sa) {
	nsa = *sa;
	nsa.sa_flags ^= SV_INTERRUPT;
	sa = &nsa;
    }

    error = sigvec(signo, sa, osa);
    if (!error && osa)
	osa->sa_flags ^= SV_INTERRUPT;		/* flip SV_INTERRUPT as above */

    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' is NULL the user just wants the current signal 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);
}
