+ 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;
+
+ sig = uap->signo;
+ if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
+ u.u_error = EINVAL;
+ return;
+ }
+ sv = &vec;
+ if (uap->osv) {
+ 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;
+ u.u_error =
+ copyout((caddr_t)sv, (caddr_t)uap->osv, sizeof (vec));
+ if (u.u_error)
+ return;
+ }
+ if (uap->nsv) {
+ u.u_error =
+ copyin((caddr_t)uap->nsv, (caddr_t)sv, sizeof (vec));
+ if (u.u_error)
+ return;
+ if (sig == SIGCONT && sv->sv_handler == SIG_IGN) {
+ u.u_error = EINVAL;
+ return;
+ }
+ setsigvec(sig, sv);
+ }
+}
+
+setsigvec(sig, sv)
+ int sig;
+ register struct sigvec *sv;
+{
+ register struct proc *p;
+ register int bit;