xref: /original-bsd/bin/kill/kill.c (revision 9d44dd09)
1 static	char *sccsid = "@(#)kill.c	4.2 (Berkeley) 10/10/80";
2 /*
3  * kill - send signal to process
4  */
5 
6 #include <signal.h>
7 #include <ctype.h>
8 
9 char *signm[] = { 0,
10 "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", "EMT", "FPE",	/* 1-8 */
11 "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", 0,	/* 9-16 */
12 "STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "TINT", "XCPU",	/* 17-24 */
13 "XFSZ", 0, 0, 0, 0, 0, 0, 0,					/* 25-31 */
14 };
15 
16 main(argc, argv)
17 char **argv;
18 {
19 	register signo, pid, res;
20 	int errlev;
21 	extern char *sys_errlist[];
22 	extern errno;
23 
24 	errlev = 0;
25 	if (argc <= 1) {
26 	usage:
27 		printf("usage: kill [ -sig ] pid ...\n");
28 		printf("for a list of signals: kill -l\n");
29 		exit(2);
30 	}
31 	if (*argv[1] == '-') {
32 		if (argv[1][1] == 'l') {
33 			for (signo = 1; signo <= NSIG; signo++) {
34 				if (signm[signo])
35 					printf("%s ", signm[signo]);
36 				if (signo == 16)
37 					printf("\n");
38 			}
39 			printf("\n");
40 			exit(0);
41 		} else if (isdigit(argv[1][1])) {
42 			signo = atoi(argv[1]+1);
43 			if (signo < 1 || signo > NSIG) {
44 				printf("kill: %s: number out of range\n",
45 				    argv[1]);
46 				exit(1);
47 			}
48 		} else {
49 			char *name = argv[1]+1;
50 			for (signo = 1; signo <= NSIG; signo++)
51 			if (signm[signo] && !strcmp(signm[signo], name))
52 				goto foundsig;
53 			printf("kill: %s: unknown signal; kill -l lists signals\n", name);
54 			exit(1);
55 foundsig:
56 			;
57 		}
58 		argc--;
59 		argv++;
60 	} else
61 		signo = SIGTERM;
62 	argv++;
63 	while (argc > 1) {
64 		if (**argv<'0' || **argv>'9')
65 			goto usage;
66 		res = kill(pid = atoi(*argv), signo);
67 		if (res<0) {
68 			printf("%u: %s\n", pid, sys_errlist[errno]);
69 			errlev = 1;
70 		}
71 		argc--;
72 		argv++;
73 	}
74 	return(errlev);
75 }
76