xref: /original-bsd/bin/kill/kill.c (revision acda45c0)
1 /*
2  * Copyright (c) 1988 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1988 Regents of the University of California.\n\
11  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)kill.c	4.7 (Berkeley) 02/25/91";
16 #endif /* not lint */
17 
18 #include <signal.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <ctype.h>
23 
24 static char *signals[] = {
25 	"hup", "int", "quit", "ill", "trap", "iot",		/*  1 - 6  */
26 	"emt", "fpe", "kill", "bus", "segv", "sys",		/*  7 - 12 */
27 	"pipe", "alrm",  "term", "urg", "stop", "tstp",		/* 13 - 18 */
28 	"cont", "chld", "ttin", "ttou", "io", "xcpu",		/* 19 - 24 */
29 	"xfsz", "vtalrm", "prof", "winch", "29", "usr1",	/* 25 - 30 */
30 	"usr2", NULL,						/* 31 - 32 */
31 	};
32 
33 main(argc, argv)
34 	int argc;
35 	char **argv;
36 {
37 	register int numsig;
38 	register char **p;
39 	int errors;
40 
41 	if (argc < 2)
42 		usage();
43 
44 	if (!strcmp(*++argv, "-l")) {
45 		printsig();
46 		exit(0);
47 	}
48 
49 	numsig = SIGTERM;
50 	if (**argv == '-') {
51 		++*argv;
52 		if (isalpha(**argv)) {
53 			if (!strncasecmp(*argv, "sig", 3))
54 				*argv += 3;
55 			for (p = signals;; ++p) {
56 				if (!*p)
57 					goto error;
58 				if (!strcasecmp(*p, *argv)) {
59 					numsig = p - signals + 1;
60 					break;
61 				}
62 			}
63 		}
64 		else if (isdigit(**argv)) {
65 			numsig = atoi(*argv);
66 			if (numsig <= 0 || numsig > NSIG)
67 				goto error;
68 		}
69 		else {
70 error:			printf("kill: unknown signal %s; valid signals:\n", *argv);
71 			printsig();
72 			exit(1);
73 		}
74 		++argv;
75 	}
76 
77 	if (!*argv)
78 		usage();
79 
80 	for (errors = 0; *argv; ++argv) {
81 		if (!isdigit(**argv))
82 			usage();
83 		if (kill(atoi(*argv), numsig) == -1) {
84 			perror(*argv);
85 			errors = 1;
86 		}
87 	}
88 	exit(errors);
89 }
90 
91 printsig()
92 {
93 	register char **p;
94 
95 	for (p = signals; *p; ++p) {
96 		printf("%s ", *p);
97 		if ((p - signals) == NSIG / 2 - 1)
98 			printf("\n");
99 	}
100 	printf("\n");
101 }
102 
103 usage()
104 {
105 	printf("usage: kill [-l] [-sig] pid ...\n");
106 	exit(2);
107 }
108