123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #include "lib.h"
- #include <fcntl.h>
- #include <unistd.h>
- #include <signal.h>
- #include <string.h>
- #include <stdio.h>
- #include <errno.h>
- static int
- note(int pid, char *msg, char *fmt)
- {
- int f;
- char pname[50];
- sprintf(pname, fmt, pid);
- f = open(pname, O_WRONLY);
- if(f < 0){
- errno = ESRCH;
- return -1;
- }
- if(msg != 0 && write(f, msg, strlen(msg)) < 0){
- close(f);
- errno = EPERM;
- return -1;
- }
- close(f);
- return 0;
- }
- int
- kill(pid_t pid, int sig)
- {
- char *msg;
- int sid, r, mpid;
- if(sig == 0)
- msg = 0;
- else {
- msg = _sigstring(sig);
- if(msg == 0) {
- errno = EINVAL;
- return -1;
- }
- }
- if(pid < 0) {
- sid = getpgrp();
- mpid = getpid();
- if(setpgid(mpid, -pid) == 0) {
- r = note(mpid, msg, "/proc/%d/notepg");
- setpgid(mpid, sid);
- } else {
- r = -1;
- }
- } else if(pid == 0)
- r = note(getpid(), msg, "/proc/%d/notepg");
- else
- r = note(pid, msg, "/proc/%d/note");
- return r;
- }
|