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/cmd/kill.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/cmd/kill.c')
-rwxr-xr-x | sys/src/ape/cmd/kill.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/sys/src/ape/cmd/kill.c b/sys/src/ape/cmd/kill.c new file mode 100755 index 000000000..a667c3e7d --- /dev/null +++ b/sys/src/ape/cmd/kill.c @@ -0,0 +1,75 @@ +#include <stdlib.h> +#include <sys/types.h> +#include <unistd.h> +#include <signal.h> +#include <ctype.h> +#include <stdio.h> +#include <string.h> + +#define NSIG SIGUSR2 + +char *signm[NSIG+1] = { 0, +"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGKILL", /* 1-7 */ +"SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUR1", "SIGUSR2", /* 8-13 */ +}; + +main(int argc, char **argv) +{ + int signo, pid, res; + int errlev; + + errlev = 0; + if (argc <= 1) { + usage: + fprintf(stderr, "usage: kill [ -sig ] pid ...\n"); + fprintf(stderr, "for a list of signals: kill -l\n"); + exit(2); + } + if (*argv[1] == '-') { + if (argv[1][1] == 'l') { + int i = 0; + for (signo = 1; signo <= NSIG; signo++) + if (signm[signo]) { + printf("%s ", signm[signo]); + if (++i%8 == 0) + printf("\n"); + } + if(i%8 !=0) + printf("\n"); + exit(0); + } else if (isdigit(argv[1][1])) { + signo = atoi(argv[1]+1); + if (signo < 0 || signo > NSIG) { + fprintf(stderr, "kill: %s: number out of range\n", + argv[1]); + exit(1); + } + } else { + char *name = argv[1]+1; + for (signo = 1; signo <= NSIG; signo++) + if (signm[signo] && ( + !strcmp(signm[signo], name)|| + !strcmp(signm[signo]+3, name))) + goto foundsig; + fprintf(stderr, "kill: %s: unknown signal; kill -l lists signals\n", name); + exit(1); +foundsig: + ; + } + argc--; + argv++; + } else + signo = SIGTERM; + argv++; + while (argc > 1) { + if ((**argv<'0' || **argv>'9') && **argv!='-') + goto usage; + res = kill(pid = atoi(*argv), signo); + if (res<0) { + perror("kill"); + } + argc--; + argv++; + } + return(errlev); +} |