+/*
+ * Initialize signal state for process 0;
+ * set to ignore signals that are ignored by default.
+ */
+siginit(p)
+ struct proc *p;
+{
+
+ p->p_sigignore = defaultignmask &~ sigmask(SIGCONT);
+}
+
+/*
+ * Reset signals for an exec of the specified process.
+ */
+execsigs(p)
+ register struct proc *p;
+{
+ register int nc, mask;
+
+ /*
+ * Reset caught signals. Held signals remain held
+ * through p_sigmask (unless they were caught,
+ * and are now ignored by default).
+ */
+ while (p->p_sigcatch) {
+ nc = ffs((long)p->p_sigcatch);
+ mask = sigmask(nc);
+ p->p_sigcatch &= ~mask;
+ if (mask & defaultignmask) {
+ if (nc != SIGCONT)
+ p->p_sigignore |= mask;
+ p->p_sig &= ~mask;
+ }
+ u.u_signal[nc] = SIG_DFL;
+ }
+ /*
+ * Reset stack state to the user stack.
+ * Clear set of signals caught on the signal stack.
+ */
+ u.u_onstack = 0;
+ u.u_sigsp = 0;
+ u.u_sigonstack = 0;
+}
+
+/*
+ * Manipulate signal mask.
+ * Note that we receive new mask, not pointer,
+ * and return old mask as return value;
+ * the library stub does the rest.
+ */
+sigprocmask()
+{
+ struct a {
+ int how;
+ sigset_t mask;
+ } *uap = (struct a *)u.u_ap;
+ register struct proc *p = u.u_procp;
+ int error = 0;
+
+ u.u_r.r_val1 = p->p_sigmask;
+ (void) splhigh();
+
+ switch (uap->how) {
+ case SIG_BLOCK:
+ p->p_sigmask |= uap->mask &~ sigcantmask;
+ break;
+
+ case SIG_UNBLOCK:
+ p->p_sigmask &= ~uap->mask;
+ break;
+
+ case SIG_SETMASK:
+ p->p_sigmask = uap->mask &~ sigcantmask;
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ (void) spl0();
+ RETURN (error);
+}
+
+sigpending()
+{
+
+ u.u_r.r_val1 = u.u_procp->p_sig;
+ RETURN (0);
+}
+
+#ifdef COMPAT_43
+/*
+ * Generalized interface signal handler, 4.3-compatible.
+ */
+osigvec()
+{
+ register struct a {
+ int signo;
+ struct sigvec *nsv;
+ struct sigvec *osv;
+ } *uap = (struct a *)u.u_ap;
+ struct sigvec vec;
+ register struct sigvec *sv;
+ register int sig;
+ int bit, error;
+
+ sig = uap->signo;
+ if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
+ RETURN (EINVAL);
+ sv = &vec;
+ if (uap->osv) {
+ *(sig_t *)&sv->sv_handler = u.u_signal[sig];
+ sv->sv_mask = u.u_sigmask[sig];
+ bit = sigmask(sig);
+ sv->sv_flags = 0;
+ if ((u.u_sigonstack & bit) != 0)
+ sv->sv_flags |= SV_ONSTACK;
+ if ((u.u_sigintr & bit) != 0)
+ sv->sv_flags |= SV_INTERRUPT;
+ if (u.u_procp->p_flag & SNOCLDSTOP)
+ sv->sv_flags |= SA_NOCLDSTOP;
+ if (error = copyout((caddr_t)sv, (caddr_t)uap->osv,
+ sizeof (vec)))
+ RETURN (error);
+ }
+ if (uap->nsv) {
+ if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv,
+ sizeof (vec)))
+ RETURN (error);
+ sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */
+ setsigvec(sig, sv);
+ }
+ RETURN (0);
+}
+
+osigblock()