*
* @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>
+#endif /* VARIANT_CANCELABLE */
+extern int __unix_conforming;
+#endif /* __DARWIN_UNIX03 */
#include <sys/param.h>
#include <signal.h>
#include <errno.h>
-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;
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;
return (omask);
}
-int sigblock(mask)
- int mask;
+int
+sigblock(int mask)
{
int omask, n;
return (n);
return (omask);
}
+#endif /* !BUILDING_VARIANT */
-int sigpause(mask)
- int mask;
+#if __DARWIN_UNIX03
+int
+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 */
-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 */