1930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes/* $NetBSD: kill.c,v 1.27 2011/08/29 14:51:18 joerg Exp $ */
2930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
3930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes/*
4930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * Copyright (c) 1988, 1993, 1994
5930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *	The Regents of the University of California.  All rights reserved.
6930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *
7930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * Redistribution and use in source and binary forms, with or without
8930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * modification, are permitted provided that the following conditions
9930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * are met:
10930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * 1. Redistributions of source code must retain the above copyright
11930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *    notice, this list of conditions and the following disclaimer.
12930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
13930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *    notice, this list of conditions and the following disclaimer in the
14930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *    documentation and/or other materials provided with the distribution.
15930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * 3. Neither the name of the University nor the names of its contributors
16930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *    may be used to endorse or promote products derived from this software
17930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *    without specific prior written permission.
18930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes *
19930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes * SUCH DAMAGE.
30930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes */
31930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
32930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <sys/cdefs.h>
33930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#if !defined(lint) && !defined(SHELL)
34930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\
35930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes The Regents of the University of California.  All rights reserved.");
36930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#endif /* not lint */
37930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
38930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#ifndef lint
39930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#if 0
40930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic char sccsid[] = "@(#)kill.c	8.4 (Berkeley) 4/28/95";
41930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#else
42930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes__RCSID("$NetBSD: kill.c,v 1.27 2011/08/29 14:51:18 joerg Exp $");
43930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#endif
44930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#endif /* not lint */
45930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
46930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <ctype.h>
47930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <err.h>
48930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <errno.h>
49930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <signal.h>
50930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <stdio.h>
51930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <stdlib.h>
52930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <limits.h>
53930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <inttypes.h>
54930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <string.h>
55930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <termios.h>
56930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <unistd.h>
57930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <locale.h>
58930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include <sys/ioctl.h>
59930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
60930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#ifdef SHELL            /* sh (aka ash) builtin */
61930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesint killcmd(int, char *argv[]);
62930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#define main killcmd
63930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#include "../../bin/sh/bltin/bltin.h"
64930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#endif /* SHELL */
65930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
66930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes__dead static void nosig(char *);
67930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic void printsignals(FILE *);
68930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic int signame_to_signum(char *);
69930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes__dead static void usage(void);
70930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
71930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesint
72930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesmain(int argc, char *argv[])
73930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes{
74930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	int errors;
75930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	intmax_t numsig, pid;
76930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	char *ep;
77930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
78930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	setprogname(argv[0]);
79930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	setlocale(LC_ALL, "");
80930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (argc < 2)
81930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		usage();
82930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
83930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	numsig = SIGTERM;
84930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
85930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	argc--, argv++;
86930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (strcmp(*argv, "-l") == 0) {
87930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		argc--, argv++;
88930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (argc > 1)
89930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			usage();
90930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (argc == 1) {
91930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (isdigit((unsigned char)**argv) == 0)
92930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				usage();
93930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			numsig = strtoimax(*argv, &ep, 10);
94930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			/* check for correctly parsed number */
95930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (*ep != '\0' || numsig == INTMAX_MIN || numsig == INTMAX_MAX) {
96930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				errx(EXIT_FAILURE, "illegal signal number: %s",
97930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes						*argv);
98930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				/* NOTREACHED */
99930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			}
100930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (numsig >= 128)
101930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				numsig -= 128;
102930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			/* and whether it fits into signals range */
103930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (numsig <= 0 || numsig >= NSIG)
104930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				nosig(*argv);
105930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			printf("%s\n", sys_signame[(int) numsig]);
106930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			exit(0);
107930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		}
108930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		printsignals(stdout);
109930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		exit(0);
110930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	}
111930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
112930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (!strcmp(*argv, "-s")) {
113930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		argc--, argv++;
114930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (argc < 1) {
115930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			warnx("option requires an argument -- s");
116930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			usage();
117930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		}
118930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (strcmp(*argv, "0")) {
119930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if ((numsig = signame_to_signum(*argv)) < 0)
120930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				nosig(*argv);
121930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		} else
122930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			numsig = 0;
123930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		argc--, argv++;
124930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	} else if (**argv == '-') {
125930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		char *sn = *argv + 1;
126930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (isalpha((unsigned char)*sn)) {
127930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if ((numsig = signame_to_signum(sn)) < 0)
128930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				nosig(sn);
129930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		} else if (isdigit((unsigned char)*sn)) {
130930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			numsig = strtoimax(sn, &ep, 10);
131930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			/* check for correctly parsed number */
132930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (*ep || numsig == INTMAX_MIN || numsig == INTMAX_MAX ) {
133930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				errx(EXIT_FAILURE, "illegal signal number: %s",
134930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes						sn);
135930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				/* NOTREACHED */
136930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			}
137930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			/* and whether it fits into signals range */
138930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (numsig < 0 || numsig >= NSIG)
139930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				nosig(sn);
140930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		} else
141930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			nosig(sn);
142930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		argc--, argv++;
143930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	}
144930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
145930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (argc == 0)
146930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		usage();
147930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
148930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	for (errors = 0; argc; argc--, argv++) {
149930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#ifdef SHELL
150930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		extern int getjobpgrp(const char *);
151930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (*argv[0] == '%') {
152930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			pid = getjobpgrp(*argv);
153930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (pid == 0) {
154930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				warnx("illegal job id: %s", *argv);
155930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				errors = 1;
156930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				continue;
157930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			}
158930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		} else
159930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#endif
160930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		{
161930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			pid = strtoimax(*argv, &ep, 10);
162930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			/* make sure the pid is a number and fits into pid_t */
163930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (!**argv || *ep || pid == INTMAX_MIN ||
164930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				pid == INTMAX_MAX || pid != (pid_t) pid) {
165930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
166930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				warnx("illegal process id: %s", *argv);
167930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				errors = 1;
168930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				continue;
169930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			}
170930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		}
171930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (kill((pid_t) pid, (int) numsig) == -1) {
172930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			warn("%s", *argv);
173930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			errors = 1;
174930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		}
175930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#ifdef SHELL
176930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		/* Wakeup the process if it was suspended, so it can
177930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		   exit without an explicit 'fg'. */
178930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (numsig == SIGTERM || numsig == SIGHUP)
179930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			kill((pid_t) pid, SIGCONT);
180930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes#endif
181930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	}
182930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
183930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	exit(errors);
184930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	/* NOTREACHED */
185930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes}
186930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
187930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic int
188930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughessigname_to_signum(char *sig)
189930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes{
190930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	int n;
191930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
192930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (strncasecmp(sig, "sig", 3) == 0)
193930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		sig += 3;
194930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	for (n = 1; n < NSIG; n++) {
195930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (!strcasecmp(sys_signame[n], sig))
196930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			return (n);
197930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	}
198930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	return (-1);
199930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes}
200930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
201930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic void
202930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesnosig(char *name)
203930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes{
204930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
205930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	warnx("unknown signal %s; valid signals:", name);
206930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	printsignals(stderr);
207930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	exit(1);
208930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	/* NOTREACHED */
209930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes}
210930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
211930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic void
212930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesprintsignals(FILE *fp)
213930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes{
214930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	int sig;
215930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	int len, nl;
216930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	const char *name;
217930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	int termwidth = 80;
218930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
219930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (isatty(fileno(fp))) {
220930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		struct winsize win;
221930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (ioctl(fileno(fp), TIOCGWINSZ, &win) == 0 && win.ws_col > 0)
222930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			termwidth = win.ws_col;
223930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	}
224930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
225930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	for (len = 0, sig = 1; sig < NSIG; sig++) {
226930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		name = sys_signame[sig];
227930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		nl = 1 + strlen(name);
228930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
229930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		if (len + nl >= termwidth) {
230930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			fprintf(fp, "\n");
231930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			len = 0;
232930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		} else
233930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes			if (len != 0)
234930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes				fprintf(fp, " ");
235930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		len += nl;
236930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		fprintf(fp, "%s", name);
237930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	}
238930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	if (len != 0)
239930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes		fprintf(fp, "\n");
240930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes}
241930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
242930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesstatic void
243930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughesusage(void)
244930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes{
245930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes
246930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	fprintf(stderr, "usage: %s [-s signal_name] pid ...\n"
247930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	    "       %s -l [exit_status]\n"
248930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	    "       %s -signal_name pid ...\n"
249930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	    "       %s -signal_number pid ...\n",
250930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	    getprogname(), getprogname(), getprogname(), getprogname());
251930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	exit(1);
252930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes	/* NOTREACHED */
253930d53eae6a12b3b11c7d0043ec8c7674b1047ccElliott Hughes}
254