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