xref: /csrg-svn/bin/kill/kill.c (revision 1363)
1*1363Sbill static	char *sccsid = "@(#)kill.c	4.2 (Berkeley) 10/10/80";
21033Sbill /*
31033Sbill  * kill - send signal to process
41033Sbill  */
51033Sbill 
61033Sbill #include <signal.h>
7*1363Sbill #include <ctype.h>
81033Sbill 
9*1363Sbill char *signm[] = { 0,
10*1363Sbill "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", "EMT", "FPE",	/* 1-8 */
11*1363Sbill "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", 0,	/* 9-16 */
12*1363Sbill "STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "TINT", "XCPU",	/* 17-24 */
13*1363Sbill "XFSZ", 0, 0, 0, 0, 0, 0, 0,					/* 25-31 */
14*1363Sbill };
15*1363Sbill 
161033Sbill main(argc, argv)
171033Sbill char **argv;
181033Sbill {
191033Sbill 	register signo, pid, res;
201033Sbill 	int errlev;
211033Sbill 	extern char *sys_errlist[];
221033Sbill 	extern errno;
231033Sbill 
241033Sbill 	errlev = 0;
251033Sbill 	if (argc <= 1) {
261033Sbill 	usage:
27*1363Sbill 		printf("usage: kill [ -sig ] pid ...\n");
28*1363Sbill 		printf("for a list of signals: kill -l\n");
291033Sbill 		exit(2);
301033Sbill 	}
311033Sbill 	if (*argv[1] == '-') {
32*1363Sbill 		if (argv[1][1] == 'l') {
33*1363Sbill 			for (signo = 1; signo <= NSIG; signo++) {
34*1363Sbill 				if (signm[signo])
35*1363Sbill 					printf("%s ", signm[signo]);
36*1363Sbill 				if (signo == 16)
37*1363Sbill 					printf("\n");
38*1363Sbill 			}
39*1363Sbill 			printf("\n");
40*1363Sbill 			exit(0);
41*1363Sbill 		} else if (isdigit(argv[1][1])) {
42*1363Sbill 			signo = atoi(argv[1]+1);
43*1363Sbill 			if (signo < 1 || signo > NSIG) {
44*1363Sbill 				printf("kill: %s: number out of range\n",
45*1363Sbill 				    argv[1]);
46*1363Sbill 				exit(1);
47*1363Sbill 			}
48*1363Sbill 		} else {
49*1363Sbill 			char *name = argv[1]+1;
50*1363Sbill 			for (signo = 1; signo <= NSIG; signo++)
51*1363Sbill 			if (signm[signo] && !strcmp(signm[signo], name))
52*1363Sbill 				goto foundsig;
53*1363Sbill 			printf("kill: %s: unknown signal; kill -l lists signals\n", name);
54*1363Sbill 			exit(1);
55*1363Sbill foundsig:
56*1363Sbill 			;
57*1363Sbill 		}
581033Sbill 		argc--;
591033Sbill 		argv++;
601033Sbill 	} else
611033Sbill 		signo = SIGTERM;
621033Sbill 	argv++;
631033Sbill 	while (argc > 1) {
641033Sbill 		if (**argv<'0' || **argv>'9')
651033Sbill 			goto usage;
661033Sbill 		res = kill(pid = atoi(*argv), signo);
671033Sbill 		if (res<0) {
681033Sbill 			printf("%u: %s\n", pid, sys_errlist[errno]);
691033Sbill 			errlev = 1;
701033Sbill 		}
711033Sbill 		argc--;
721033Sbill 		argv++;
731033Sbill 	}
741033Sbill 	return(errlev);
751033Sbill }
76