X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/59e0d9fe772464b93d835d2a2964457702469a43..fc56b708803d28b949a9181528bb0da4d25b3b7b:/compat-43/sigcompat.c diff --git a/compat-43/sigcompat.c b/compat-43/sigcompat.c index d4b2f8f..1e8ca39 100644 --- a/compat-43/sigcompat.c +++ b/compat-43/sigcompat.c @@ -3,8 +3,6 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * 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 @@ -55,19 +53,28 @@ * SUCH DAMAGE. */ +#if __DARWIN_UNIX03 +#ifdef VARIANT_CANCELABLE +#include +#endif /* VARIANT_CANCELABLE */ +extern int __unix_conforming; +#endif /* __DARWIN_UNIX03 */ #include #include #include + +#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__(signo, sv, osv, bind) - int signo; - struct sigvec *sv, *osv; - int bind; +sigvec__(int signo, + struct sigvec *sv, + struct sigvec *osv, + int bind) { int ret; @@ -88,26 +95,25 @@ sigvec__(signo, sv, osv, bind) } int -sigvec(signo, sv, osv) - int signo; - struct sigvec *sv, *osv; +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; +_sigvec_nobind(int signo, + struct sigvec *sv, + struct sigvec *osv) { return sigvec__(signo, sv, osv, 0); } #endif int -sigsetmask(mask) - int mask; +sigsetmask(int mask) { int omask, n; @@ -118,8 +124,7 @@ sigsetmask(mask) } int -sigblock(mask) - int mask; +sigblock(int mask) { int omask, n; @@ -128,35 +133,62 @@ sigblock(mask) return (n); return (omask); } +#endif /* !BUILDING_VARIANT */ +#if __DARWIN_UNIX03 int -sigpause(mask) - int mask; +sigpause(int sig) +{ + sigset_t 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 */ +#ifndef BUILDING_VARIANT int -sighold(sig) - int sig; +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; +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)); @@ -164,9 +196,40 @@ sigrelse(sig) int -sigignore(sig) - int sig; +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 */