+ register struct hpuxsigaction_args *uap;
+ int *retval;
+{
+ struct hpuxsigaction action;
+ register struct sigacts *ps = p->p_sigacts;
+ register struct hpuxsigaction *sa;
+ register int sig;
+ int bit;
+
+ sig = hpuxtobsdsig(uap->signo);
+ if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
+ return (EINVAL);
+
+ sa = &action;
+ if (uap->osa) {
+ sa->sa_handler = ps->ps_sigact[sig];
+ bzero((caddr_t)&sa->sa_mask, sizeof(sa->sa_mask));
+ sa->sa_mask.sigset[0] = bsdtohpuxmask(ps->ps_catchmask[sig]);
+ bit = sigmask(sig);
+ sa->sa_flags = 0;
+ if ((ps->ps_sigonstack & bit) != 0)
+ sa->sa_flags |= HPUXSA_ONSTACK;
+#if 0
+/* XXX -- SOUSIG no longer exists, do something here */
+ if (p->p_flag & SOUSIG)
+ sa->sa_flags |= HPUXSA_RESETHAND; /* XXX */
+#endif
+ if (p->p_flag & P_NOCLDSTOP)
+ sa->sa_flags |= HPUXSA_NOCLDSTOP;
+ if (copyout((caddr_t)sa, (caddr_t)uap->osa, sizeof (action)))
+ return (EFAULT);
+ }
+ if (uap->nsa) {
+ struct sigaction act;
+
+ if (copyin((caddr_t)uap->nsa, (caddr_t)sa, sizeof (action)))
+ return (EFAULT);
+ if (sig == SIGCONT && sa->sa_handler == SIG_IGN)
+ return (EINVAL);
+ /*
+ * Create a sigaction struct for setsigvec
+ */
+ act.sa_handler = sa->sa_handler;
+ act.sa_mask = hpuxtobsdmask(sa->sa_mask.sigset[0]);
+ act.sa_flags == SA_RESTART;
+ if (sa->sa_flags & HPUXSA_ONSTACK)
+ act.sa_flags |= SA_ONSTACK;
+ if (sa->sa_flags & HPUXSA_NOCLDSTOP)
+ act.sa_flags |= SA_NOCLDSTOP;
+ setsigvec(p, sig, &act);
+#if 0
+/* XXX -- SOUSIG no longer exists, do something here */
+ if (sa->sa_flags & HPUXSA_RESETHAND)
+ p->p_flag |= SOUSIG; /* XXX */
+#endif
+ }
+ return (0);
+}
+
+#ifdef COMPAT_OHPUX
+struct ohpuxssig_args {
+ int signo;
+ sig_t fun;
+};
+compat_43_hpuxssig(p, uap, retval)
+ struct proc *p;
+ struct ohpuxssig_args *uap;