X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/5b2abdfbf4211b6592cdd02b9507555a0ecbb04b..fc56b708803d28b949a9181528bb0da4d25b3b7b:/compat-43/sigcompat.c diff --git a/compat-43/sigcompat.c b/compat-43/sigcompat.c index a0f5721..1e8ca39 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@ */ @@ -52,15 +53,28 @@ * SUCH DAMAGE. */ +#if __DARWIN_UNIX03 +#ifdef VARIANT_CANCELABLE +#include +#endif /* VARIANT_CANCELABLE */ +extern int __unix_conforming; +#endif /* __DARWIN_UNIX03 */ #include #include #include -static int sigvec__(signo, sv, osv, bind) - int signo; - struct sigvec *sv, *osv; - int bind; +#ifndef BUILDING_VARIANT +#if defined(__DYNAMIC__) +extern int _sigaction_nobind (int sig, const struct sigaction *nsv, struct sigaction *osv); +extern int _sigvec_nobind (int, struct sigvec *, struct sigvec *); +#endif + +static int +sigvec__(int signo, + struct sigvec *sv, + struct sigvec *osv, + int bind) { int ret; @@ -80,24 +94,26 @@ static int sigvec__(signo, sv, osv, bind) return (ret); } -int sigvec(signo, sv, osv) - int signo; - struct sigvec *sv, *osv; +int +sigvec(int signo, + struct sigvec *sv, + struct sigvec *osv) { return sigvec__(signo, sv, osv, 1); } #if defined(__DYNAMIC__) -int _sigvec_nobind(signo, sv, osv) - int signo; - struct sigvec *sv, *osv; +int +_sigvec_nobind(int signo, + struct sigvec *sv, + struct sigvec *osv) { return sigvec__(signo, sv, osv, 0); } #endif -int sigsetmask(mask) - int mask; +int +sigsetmask(int mask) { int omask, n; @@ -107,8 +123,8 @@ int sigsetmask(mask) return (omask); } -int sigblock(mask) - int mask; +int +sigblock(int mask) { int omask, n; @@ -117,33 +133,103 @@ int sigblock(mask) return (n); return (omask); } +#endif /* !BUILDING_VARIANT */ + +#if __DARWIN_UNIX03 +int +sigpause(int sig) +{ + sigset_t mask; -int sigpause(mask) - int mask; + if (__unix_conforming == 0) + __unix_conforming = 1; +#ifdef VARIANT_CANCELABLE + pthread_testcancel(); +#endif /* VARIANT_CANCELABLE */ + + if ((sig <= 0) || (sig >= NSIG)) { + errno = EINVAL; + return(-1); + } + if (sigprocmask(SIG_BLOCK, (sigset_t *) 0, (sigset_t *) &mask) < 0) { + return(-1); + } + sigdelset(&mask, sig); + return (sigsuspend(&mask)); +} +#else +int +sigpause(int mask) { return (sigsuspend((sigset_t *)&mask)); } +#endif /* __DARWIN_UNIX03 */ -int sighold(sig) - int sig; +#ifndef BUILDING_VARIANT +int +sighold(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 sig; + +int +sigrelse(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(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); + } +} +#endif /* !BUILDING_VARIANT */