- u.u_error = kill1(uap->signo < 0,
- uap->signo < 0 ? -uap->signo : uap->signo, uap->pid);
+ if (uap->signo < 0 || uap->signo > NSIG) {
+ u.u_error = EINVAL;
+ return;
+ }
+ if (uap->pid > 0) {
+ /* kill single process */
+ p = pfind(uap->pid);
+ if (p == 0) {
+ u.u_error = ESRCH;
+ return;
+ }
+ if (u.u_uid && u.u_uid != p->p_uid)
+ u.u_error = EPERM;
+ else if (uap->signo)
+ psignal(p, uap->signo);
+ return;
+ }
+ switch (uap->pid) {
+ case -1: /* broadcast signal */
+ u.u_error = killpg1(uap->signo, 0, 1);
+ break;
+ case 0: /* signal own process group */
+ u.u_error = killpg1(uap->signo, 0, 0);
+ break;
+ default: /* negative explicit process group */
+ u.u_error = killpg1(uap->signo, -uap->pid, 0);
+ break;
+ }
+ return;