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
9219b2ee8SDavid du Colombier static int
note(int pid,char * msg,char * fmt)10219b2ee8SDavid du Colombier note(int pid, char *msg, char *fmt)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier int f;
13219b2ee8SDavid du Colombier char pname[50];
143e12c5d1SDavid du Colombier
15219b2ee8SDavid du Colombier sprintf(pname, fmt, pid);
163e12c5d1SDavid du Colombier f = open(pname, O_WRONLY);
17219b2ee8SDavid du Colombier if(f < 0){
18219b2ee8SDavid du Colombier errno = ESRCH;
19219b2ee8SDavid du Colombier return -1;
20219b2ee8SDavid du Colombier }
21219b2ee8SDavid du Colombier if(msg != 0 && write(f, msg, strlen(msg)) < 0){
223e12c5d1SDavid du Colombier close(f);
23219b2ee8SDavid 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 }
29219b2ee8SDavid du Colombier
30219b2ee8SDavid du Colombier int
kill(pid_t pid,int sig)31219b2ee8SDavid du Colombier kill(pid_t pid, int sig)
32219b2ee8SDavid du Colombier {
33219b2ee8SDavid du Colombier char *msg;
34219b2ee8SDavid du Colombier int sid, r, mpid;
35219b2ee8SDavid du Colombier
36219b2ee8SDavid du Colombier if(sig == 0)
37219b2ee8SDavid du Colombier msg = 0;
38219b2ee8SDavid du Colombier else {
39219b2ee8SDavid du Colombier msg = _sigstring(sig);
40219b2ee8SDavid du Colombier if(msg == 0) {
41219b2ee8SDavid du Colombier errno = EINVAL;
42219b2ee8SDavid du Colombier return -1;
43219b2ee8SDavid du Colombier }
44219b2ee8SDavid du Colombier }
45219b2ee8SDavid du Colombier
46219b2ee8SDavid du Colombier if(pid < 0) {
47219b2ee8SDavid du Colombier sid = getpgrp();
48219b2ee8SDavid du Colombier mpid = getpid();
49*6b0d5c8bSDavid du Colombier if(setpgid(mpid, -pid) == 0) {
50219b2ee8SDavid du Colombier r = note(mpid, msg, "/proc/%d/notepg");
51219b2ee8SDavid du Colombier setpgid(mpid, sid);
525aa528faSDavid du Colombier } else {
535aa528faSDavid du Colombier r = -1;
545aa528faSDavid du Colombier }
55219b2ee8SDavid du Colombier } else if(pid == 0)
56219b2ee8SDavid du Colombier r = note(getpid(), msg, "/proc/%d/notepg");
57219b2ee8SDavid du Colombier else
58219b2ee8SDavid du Colombier r = note(pid, msg, "/proc/%d/note");
59219b2ee8SDavid du Colombier return r;
60219b2ee8SDavid du Colombier }
61