- register a, sig;
- register struct a {
- int pid;
- int signo;
- } *uap;
- int f, priv;
-
- uap = (struct a *)u.u_ap;
- f = 0;
- a = uap->pid;
- priv = 0;
- sig = uap->signo;
- if (sig < 0)
- /*
- * A negative signal means send to process group.
- */
- uap->signo = -uap->signo;
- if (uap->signo == 0 || uap->signo > NSIG) {
- u.u_error = EINVAL;
- return;
+ struct sigsuspend_args *uap;
+ int *retval;
+{
+ register struct sigacts *ps = p->p_sigacts;
+
+ /*
+ * When returning from sigpause, we want
+ * the old mask to be restored after the
+ * signal handler has finished. Thus, we
+ * save it here and mark the sigacts structure
+ * to indicate this.
+ */
+ ps->ps_oldmask = p->p_sigmask;
+ ps->ps_flags |= SAS_OLDMASK;
+ p->p_sigmask = uap->mask &~ sigcantmask;
+ while (tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0) == 0)
+ /* void */;
+ /* always return EINTR rather than ERESTART... */
+ return (EINTR);
+}
+
+#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
+struct osigstack_args {
+ struct sigstack *nss;
+ struct sigstack *oss;
+};
+/* ARGSUSED */
+osigstack(p, uap, retval)
+ struct proc *p;
+ register struct osigstack_args *uap;
+ int *retval;
+{
+ struct sigstack ss;
+ struct sigacts *psp;
+ int error = 0;
+
+ psp = p->p_sigacts;
+ ss.ss_sp = psp->ps_sigstk.ss_base;
+ ss.ss_onstack = psp->ps_sigstk.ss_flags & SA_ONSTACK;
+ if (uap->oss && (error = copyout((caddr_t)&ss, (caddr_t)uap->oss,
+ sizeof (struct sigstack))))
+ return (error);
+ if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss,
+ sizeof (ss))) == 0) {
+ psp->ps_sigstk.ss_base = ss.ss_sp;
+ psp->ps_sigstk.ss_size = 0;
+ psp->ps_sigstk.ss_flags |= ss.ss_onstack & SA_ONSTACK;
+ psp->ps_flags |= SAS_ALTSTACK;