From: Todd C. Miller Date: Sat, 8 Dec 2001 19:23:11 +0000 (+0000) Subject: Emulate sigaction() using sigvec() X-Git-Tag: SUDO_1_6_4~155 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9af30ba66efbb5fefb4223924ad1924fc476f75b;p=sudo Emulate sigaction() using sigvec() --- diff --git a/sigaction.c b/sigaction.c new file mode 100644 index 000000000..bfa06d4f7 --- /dev/null +++ b/sigaction.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2001 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 4. Products derived from this software may not be called "Sudo" nor + * may "Sudo" appear in their names without specific prior written + * permission from the author. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include + +#ifndef lint +static const char rcsid[] = "$Sudo$"; +#endif /* lint */ + +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 |= sigmask(signo); + return(0); +} + +int +sigdelset(set, signo) + sigset_t *set; + int signo; +{ + + if (signo <= 0 || signo >= NSIG) { + errno = EINVAL; + return(-1); + } + + *set &= ~(sigmask(signo)); + return(0); +} + +int +sigismember(set, signo) + sigset_t *set; + int signo; +{ + + return(*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 == NULL) + 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); +}