*
* @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
* SUCH DAMAGE.
*/
+#if __DARWIN_UNIX03
+#ifdef VARIANT_CANCELABLE
+#include <pthread.h>
+
+extern void _pthread_testcancel(pthread_t thread, int isconforming);
+#endif /* VARIANT_CANCELABLE */
+extern int __unix_conforming;
+#endif /* __DARWIN_UNIX03 */
#include <sys/param.h>
#include <signal.h>
#include <errno.h>
+
+#ifndef BUILDING_VARIANT
#if defined(__DYNAMIC__)
extern int _sigaction_nobind (int sig, const struct sigaction *nsv, struct sigaction *osv);
#endif
return (n);
return (omask);
}
+#endif /* !BUILDING_VARIANT */
+#if __DARWIN_UNIX03
+int
+sigpause(sig)
+ int sig;
+{
+ sigset_t mask;
+
+ if (__unix_conforming == 0)
+ __unix_conforming = 1;
+#ifdef VARIANT_CANCELABLE
+ _pthread_testcancel(pthread_self(), 1);
+#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(mask)
int mask;
{
return (sigsuspend((sigset_t *)&mask));
}
+#endif /* __DARWIN_UNIX03 */
+#ifndef BUILDING_VARIANT
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));
{
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));
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 */