xref: /plan9/sys/src/ape/cmd/kill.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <stdlib.h>
2*219b2ee8SDavid du Colombier #include <sys/types.h>
3*219b2ee8SDavid du Colombier #include <unistd.h>
4*219b2ee8SDavid du Colombier #include <signal.h>
5*219b2ee8SDavid du Colombier #include <ctype.h>
6*219b2ee8SDavid du Colombier #include <stdio.h>
7*219b2ee8SDavid du Colombier #include <string.h>
8*219b2ee8SDavid du Colombier 
9*219b2ee8SDavid du Colombier #define NSIG SIGUSR2
10*219b2ee8SDavid du Colombier 
11*219b2ee8SDavid du Colombier char *signm[NSIG+1] = { 0,
12*219b2ee8SDavid du Colombier "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGKILL", /* 1-7 */
13*219b2ee8SDavid du Colombier "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUR1", "SIGUSR2", /* 8-13 */
14*219b2ee8SDavid du Colombier };
15*219b2ee8SDavid du Colombier 
main(int argc,char ** argv)16*219b2ee8SDavid du Colombier main(int argc, char **argv)
17*219b2ee8SDavid du Colombier {
18*219b2ee8SDavid du Colombier 	int signo, pid, res;
19*219b2ee8SDavid du Colombier 	int errlev;
20*219b2ee8SDavid du Colombier 
21*219b2ee8SDavid du Colombier 	errlev = 0;
22*219b2ee8SDavid du Colombier 	if (argc <= 1) {
23*219b2ee8SDavid du Colombier 	usage:
24*219b2ee8SDavid du Colombier 		fprintf(stderr, "usage: kill [ -sig ] pid ...\n");
25*219b2ee8SDavid du Colombier 		fprintf(stderr, "for a list of signals: kill -l\n");
26*219b2ee8SDavid du Colombier 		exit(2);
27*219b2ee8SDavid du Colombier 	}
28*219b2ee8SDavid du Colombier 	if (*argv[1] == '-') {
29*219b2ee8SDavid du Colombier 		if (argv[1][1] == 'l') {
30*219b2ee8SDavid du Colombier 			int i = 0;
31*219b2ee8SDavid du Colombier 			for (signo = 1; signo <= NSIG; signo++)
32*219b2ee8SDavid du Colombier 				if (signm[signo]) {
33*219b2ee8SDavid du Colombier 					printf("%s ", signm[signo]);
34*219b2ee8SDavid du Colombier 					if (++i%8 == 0)
35*219b2ee8SDavid du Colombier 						printf("\n");
36*219b2ee8SDavid du Colombier 				}
37*219b2ee8SDavid du Colombier 			if(i%8 !=0)
38*219b2ee8SDavid du Colombier 				printf("\n");
39*219b2ee8SDavid du Colombier 			exit(0);
40*219b2ee8SDavid du Colombier 		} else if (isdigit(argv[1][1])) {
41*219b2ee8SDavid du Colombier 			signo = atoi(argv[1]+1);
42*219b2ee8SDavid du Colombier 			if (signo < 0 || signo > NSIG) {
43*219b2ee8SDavid du Colombier 				fprintf(stderr, "kill: %s: number out of range\n",
44*219b2ee8SDavid du Colombier 				    argv[1]);
45*219b2ee8SDavid du Colombier 				exit(1);
46*219b2ee8SDavid du Colombier 			}
47*219b2ee8SDavid du Colombier 		} else {
48*219b2ee8SDavid du Colombier 			char *name = argv[1]+1;
49*219b2ee8SDavid du Colombier 			for (signo = 1; signo <= NSIG; signo++)
50*219b2ee8SDavid du Colombier 				if (signm[signo] && (
51*219b2ee8SDavid du Colombier 				    !strcmp(signm[signo], name)||
52*219b2ee8SDavid du Colombier 				    !strcmp(signm[signo]+3, name)))
53*219b2ee8SDavid du Colombier 					goto foundsig;
54*219b2ee8SDavid du Colombier 			fprintf(stderr, "kill: %s: unknown signal; kill -l lists signals\n", name);
55*219b2ee8SDavid du Colombier 			exit(1);
56*219b2ee8SDavid du Colombier foundsig:
57*219b2ee8SDavid du Colombier 			;
58*219b2ee8SDavid du Colombier 		}
59*219b2ee8SDavid du Colombier 		argc--;
60*219b2ee8SDavid du Colombier 		argv++;
61*219b2ee8SDavid du Colombier 	} else
62*219b2ee8SDavid du Colombier 		signo = SIGTERM;
63*219b2ee8SDavid du Colombier 	argv++;
64*219b2ee8SDavid du Colombier 	while (argc > 1) {
65*219b2ee8SDavid du Colombier 		if ((**argv<'0' || **argv>'9') && **argv!='-')
66*219b2ee8SDavid du Colombier 			goto usage;
67*219b2ee8SDavid du Colombier 		res = kill(pid = atoi(*argv), signo);
68*219b2ee8SDavid du Colombier 		if (res<0) {
69*219b2ee8SDavid du Colombier 			perror("kill");
70*219b2ee8SDavid du Colombier 		}
71*219b2ee8SDavid du Colombier 		argc--;
72*219b2ee8SDavid du Colombier 		argv++;
73*219b2ee8SDavid du Colombier 	}
74*219b2ee8SDavid du Colombier 	return(errlev);
75*219b2ee8SDavid du Colombier }
76