+
+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 */