xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/kill.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include <fcntl.h>
33e12c5d1SDavid du Colombier #include <unistd.h>
43e12c5d1SDavid du Colombier #include <signal.h>
53e12c5d1SDavid du Colombier #include <string.h>
63e12c5d1SDavid du Colombier #include <stdio.h>
73e12c5d1SDavid du Colombier #include <errno.h>
83e12c5d1SDavid du Colombier 
9*219b2ee8SDavid du Colombier static int
10*219b2ee8SDavid du Colombier note(int pid, char *msg, char *fmt)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	int f;
13*219b2ee8SDavid du Colombier 	char pname[50];
143e12c5d1SDavid du Colombier 
15*219b2ee8SDavid du Colombier 	sprintf(pname, fmt, pid);
163e12c5d1SDavid du Colombier 	f = open(pname, O_WRONLY);
17*219b2ee8SDavid du Colombier 	if(f < 0){
18*219b2ee8SDavid du Colombier 		errno = ESRCH;
19*219b2ee8SDavid du Colombier 		return -1;
20*219b2ee8SDavid du Colombier 	}
21*219b2ee8SDavid du Colombier 	if(msg != 0 && write(f, msg, strlen(msg)) < 0){
223e12c5d1SDavid du Colombier 		close(f);
23*219b2ee8SDavid du Colombier 		errno = EPERM;
243e12c5d1SDavid du Colombier 		return -1;
253e12c5d1SDavid du Colombier 	}
263e12c5d1SDavid du Colombier 	close(f);
273e12c5d1SDavid du Colombier 	return 0;
283e12c5d1SDavid du Colombier }
29*219b2ee8SDavid du Colombier 
30*219b2ee8SDavid du Colombier int
31*219b2ee8SDavid du Colombier kill(pid_t pid, int sig)
32*219b2ee8SDavid du Colombier {
33*219b2ee8SDavid du Colombier 	char *msg;
34*219b2ee8SDavid du Colombier 	int sid, r, mpid;
35*219b2ee8SDavid du Colombier 
36*219b2ee8SDavid du Colombier 	if(sig == 0)
37*219b2ee8SDavid du Colombier 		msg = 0;
38*219b2ee8SDavid du Colombier 	else {
39*219b2ee8SDavid du Colombier 		msg = _sigstring(sig);
40*219b2ee8SDavid du Colombier 		if(msg == 0) {
41*219b2ee8SDavid du Colombier 			errno = EINVAL;
42*219b2ee8SDavid du Colombier 			return -1;
43*219b2ee8SDavid du Colombier 		}
44*219b2ee8SDavid du Colombier 	}
45*219b2ee8SDavid du Colombier 
46*219b2ee8SDavid du Colombier 	if(pid < 0) {
47*219b2ee8SDavid du Colombier 		sid = getpgrp();
48*219b2ee8SDavid du Colombier 		mpid = getpid();
49*219b2ee8SDavid du Colombier 		setpgid(mpid, -pid);
50*219b2ee8SDavid du Colombier 		r = note(mpid, msg, "/proc/%d/notepg");
51*219b2ee8SDavid du Colombier 		setpgid(mpid, sid);
52*219b2ee8SDavid du Colombier 	} else if(pid == 0)
53*219b2ee8SDavid du Colombier 		r = note(getpid(), msg, "/proc/%d/notepg");
54*219b2ee8SDavid du Colombier 	else
55*219b2ee8SDavid du Colombier 		r = note(pid, msg, "/proc/%d/note");
56*219b2ee8SDavid du Colombier 
57*219b2ee8SDavid du Colombier 	return r;
58*219b2ee8SDavid du Colombier }
59