/* * skill - signal a process and all its children * written by Bob Greenberg */ /* * convert to use gettable() instead of gprocs() * Craig McGregor */ #define GETTAB #include "/srce/usr/sys/param.h" #include "/srce/usr/sys/proc.h" int *p__t, *p__te, p__sig; skill(pid, sig) { register int i, *n; struct proc procs[2*NPROC]; #ifndef GETTAB if (gprocs(0) >= 2*NPROC) return(-1); i = gprocs(procs); #else GETTAB if (gettab(0, NULL, sizeof procs) >= 2*NPROC) return(-1); i = gettab(0, procs, sizeof procs); #endif GETTAB p__t = procs; p__te = &procs[i]; p__sig = sig; return(sk_2(pid)); } /* NON-RBGUNIX version: register int i, *n, mem; struct proc procs[NPROC]; struct { char name[8]; int type; char *value; } nl[2]; if ((mem = open("/dev/mem",0)) < 0) return(-1); n = nl; *n++ = '_p'; *n++ = 'ro'; *n++ = 'c'; for (i = 10; --i;) *n++ = 0; nlist("/unix",nl); if (nl[0].type == 0) return(-1); seek(mem, nl[0].value, 0); if (read(mem, procs, sizeof procs) < sizeof procs) return(-1); close(mem); p__t = procs; */ sk_2(pidd) { register struct proc *p; register int n, pid; int n2; n = 0; pid = pidd; n2 = 1; for (p = p__t; p <= p__te; p++) { if (p->p_stat == 0) continue; if (p->p_ppid == pid) n =| sk_2(p->p_pid); if (p->p_pid == pid) n2 = 0; } if (n2 == 0 && kill(pid,p__sig) < 0) n2 = 1; return(n2 | n); }