*
* @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@
*/
#include <sys/param.h>
#include <signal.h>
#include <errno.h>
+#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;
return (ret);
}
-int sigvec(signo, sv, osv)
+int
+sigvec(signo, sv, osv)
int signo;
struct sigvec *sv, *osv;
{
}
#if defined(__DYNAMIC__)
-int _sigvec_nobind(signo, sv, osv)
+int
+_sigvec_nobind(signo, sv, osv)
int signo;
struct sigvec *sv, *osv;
{
}
#endif
-int sigsetmask(mask)
+int
+sigsetmask(mask)
int mask;
{
int omask, n;
return (omask);
}
-int sigblock(mask)
+int
+sigblock(mask)
int mask;
{
int omask, n;
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);
+ }
+}