X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/5b2abdfbf4211b6592cdd02b9507555a0ecbb04b..750c276ac572463e789bfb86a495cd1ba93fe6f7:/compat-43/sigcompat.c diff --git a/compat-43/sigcompat.c b/compat-43/sigcompat.c index a0f5721..ba1aed1 100644 --- a/compat-43/sigcompat.c +++ b/compat-43/sigcompat.c @@ -3,19 +3,20 @@ * * @APPLE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -56,8 +57,12 @@ #include #include #include +#if defined(__DYNAMIC__) +extern int _sigaction_nobind (int sig, const struct sigaction *nsv, struct sigaction *osv); +#endif -static int sigvec__(signo, sv, osv, bind) +static int +sigvec__(signo, sv, osv, bind) int signo; struct sigvec *sv, *osv; int bind; @@ -80,7 +85,8 @@ static int sigvec__(signo, sv, osv, bind) return (ret); } -int sigvec(signo, sv, osv) +int +sigvec(signo, sv, osv) int signo; struct sigvec *sv, *osv; { @@ -88,7 +94,8 @@ int sigvec(signo, sv, osv) } #if defined(__DYNAMIC__) -int _sigvec_nobind(signo, sv, osv) +int +_sigvec_nobind(signo, sv, osv) int signo; struct sigvec *sv, *osv; { @@ -96,7 +103,8 @@ int _sigvec_nobind(signo, sv, osv) } #endif -int sigsetmask(mask) +int +sigsetmask(mask) int mask; { int omask, n; @@ -107,7 +115,8 @@ int sigsetmask(mask) return (omask); } -int sigblock(mask) +int +sigblock(mask) int mask; { int omask, n; @@ -118,32 +127,79 @@ int sigblock(mask) return (omask); } -int sigpause(mask) +int +sigpause(mask) int mask; { return (sigsuspend((sigset_t *)&mask)); } -int sighold(sig) +int +sighold(sig) int sig; { sigset_t mask; - if ((sig < 0) || (sig > NSIG)) - return(EINVAL); + if ((sig <= 0) || (sig >= NSIG)) { + errno = EINVAL; + return(-1); + } sigemptyset(&mask); sigaddset(&mask, sig); return(sigprocmask(SIG_BLOCK, &mask,(sigset_t *)0)); } -int sigrelse(sig) + +int +sigrelse(sig) int sig; { sigset_t mask; - if ((sig < 0) || (sig > NSIG)) - return(EINVAL); + if ((sig <= 0) || (sig >= NSIG)) { + errno = EINVAL; + return(-1); + } sigemptyset(&mask); sigaddset(&mask, sig); return(sigprocmask(SIG_UNBLOCK, &mask,(sigset_t *)0)); } + +int +sigignore(sig) + int sig; +{ + return (signal(sig, SIG_IGN) == SIG_ERR ? -1 : 0); +} + +void (*sigset(int sig, void (*disp)(int)))(int) { + sigset_t omask; + int blocked; + struct sigaction oact; + + if ((sig <= 0) || (sig >= NSIG)) { + errno = EINVAL; + return (SIG_ERR); + } + if (-1 == sigprocmask(0, NULL, &omask)) + return (SIG_ERR); + blocked = sigismember(&omask, sig); + if (disp == SIG_HOLD) { + if (blocked) + return (SIG_HOLD); + if ((-1 == sigaction(sig, NULL, &oact)) || + (-1 == sighold(sig))) + return (SIG_ERR); + return (sig_t)oact.sa_handler; + } else { + if (blocked) { + if (-1 == sigrelse(sig)) + return (SIG_ERR); + } + sig_t rv = signal(sig, disp); + if (rv != SIG_ERR) + return blocked ? SIG_HOLD : rv; + else + return (rv); + } +}