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