diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/lib/ap/plan9/kill.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/lib/ap/plan9/kill.c')
-rwxr-xr-x | sys/src/ape/lib/ap/plan9/kill.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/sys/src/ape/lib/ap/plan9/kill.c b/sys/src/ape/lib/ap/plan9/kill.c new file mode 100755 index 000000000..95bbbdcc7 --- /dev/null +++ b/sys/src/ape/lib/ap/plan9/kill.c @@ -0,0 +1,60 @@ +#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; +} |