1e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/*
2e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * Copyright 1998-2002 by Albert Cahalan; all rights resered.
3e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * This file may be used subject to the terms and conditions of the
4e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * GNU Library General Public License Version 2, or any later version
5e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * at your option, as published by the Free Software Foundation.
6e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * This program is distributed in the hope that it will be useful,
7e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * but WITHOUT ANY WARRANTY; without even the implied warranty of
8e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * GNU Library General Public License for more details.
10e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew */
11e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <signal.h>
12e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <string.h>
13e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <stdio.h>
14e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include <stdlib.h>
15e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#include "sig.h"
16e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
17e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* Linux signals:
18e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew *
19e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * SIGSYS is required by Unix98.
20e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * SIGEMT is part of SysV, BSD, and ancient UNIX tradition.
21e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew *
22e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * They are provided by these Linux ports: alpha, mips, sparc, and sparc64.
23e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * You get SIGSTKFLT and SIGUNUSED instead on i386, m68k, ppc, and arm.
24e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * (this is a Linux & libc bug -- both must be fixed)
25e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew *
26e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * Total garbage: SIGIO SIGINFO SIGIOT SIGLOST SIGCLD
27e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew *                 (popular ones are handled as aliases)
28e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew * Nearly garbage: SIGSTKFLT SIGUNUSED (nothing else to fill slots)
29e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew */
30e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
31e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* Linux 2.3.29 replaces SIGUNUSED with the standard SIGSYS signal */
32e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifndef SIGSYS
33354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#warning Standards require that <signal.h> define SIGSYS
34354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGSYS SIGUNUSED
35e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif
36e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
37e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* If we see both, it is likely SIGSTKFLT (junk) was replaced. */
38e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifdef SIGEMT
39354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#undef SIGSTKFLT
40e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif
41e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
42e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifndef SIGRTMIN
43354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#warning Standards require that <signal.h> define SIGRTMIN; assuming 32
44354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGRTMIN 32
45e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif
46e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
47e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* It seems the SPARC libc does not know the kernel supports SIGPWR. */
48e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifndef SIGPWR
49354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#warning Your header files lack SIGPWR. (assuming it is number 29)
50354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define SIGPWR 29
51e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif
52e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
53e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiewtypedef struct mapstruct {
54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	const char *name;
55354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int num;
56e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew} mapstruct;
57e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
58e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiewstatic const mapstruct sigtable[] = {
59354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"ABRT", SIGABRT},	/* IOT */
60354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"ALRM", SIGALRM},
61354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"BUS", SIGBUS},
62354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"CHLD", SIGCHLD},	/* CLD */
63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"CONT", SIGCONT},
64e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifdef SIGEMT
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"EMT", SIGEMT},
66e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif
67354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"FPE", SIGFPE},
68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"HUP", SIGHUP},
69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"ILL", SIGILL},
70354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"INT", SIGINT},
71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"KILL", SIGKILL},
72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"PIPE", SIGPIPE},
73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"POLL", SIGPOLL},	/* IO */
74354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"PROF", SIGPROF},
75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"PWR", SIGPWR},
76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"QUIT", SIGQUIT},
77354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"SEGV", SIGSEGV},
78e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#ifdef SIGSTKFLT
79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"STKFLT", SIGSTKFLT},
80e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew#endif
81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"STOP", SIGSTOP},
82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"SYS", SIGSYS},	/* UNUSED */
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"TERM", SIGTERM},
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"TRAP", SIGTRAP},
85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"TSTP", SIGTSTP},
86354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"TTIN", SIGTTIN},
87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"TTOU", SIGTTOU},
88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"URG", SIGURG},
89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"USR1", SIGUSR1},
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"USR2", SIGUSR2},
91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"VTALRM", SIGVTALRM},
92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"WINCH", SIGWINCH},
93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"XCPU", SIGXCPU},
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{"XFSZ", SIGXFSZ}
95e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew};
96e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
97354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic const int number_of_signals = sizeof(sigtable) / sizeof(mapstruct);
98e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int compare_signal_names(const void *a, const void *b)
100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return strcasecmp(((const mapstruct *)a)->name,
102354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			  ((const mapstruct *)b)->name);
103e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}
104e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
105e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* return -1 on failure */
106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint signal_name_to_number(const char *restrict name)
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	long val;
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int offset;
110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* clean up name */
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strncasecmp(name, "SIG", 3))
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		name += 3;
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strcasecmp(name, "CLD"))
116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return SIGCHLD;
117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strcasecmp(name, "IO"))
118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return SIGPOLL;
119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strcasecmp(name, "IOT"))
120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return SIGABRT;
121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* search the table */
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		const mapstruct ms = { name, 0 };
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		const mapstruct *restrict const ptr = bsearch(&ms,
126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							      sigtable,
127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							      number_of_signals,
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							      sizeof(mapstruct),
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							      compare_signal_names);
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (ptr)
131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return ptr->num;
132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strcasecmp(name, "RTMIN"))
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return SIGRTMIN;
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strcasecmp(name, "EXIT"))
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return 0;
138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strcasecmp(name, "NULL"))
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return 0;
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	offset = 0;
142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!strncasecmp(name, "RTMIN+", 6)) {
143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		name += 6;
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		offset = SIGRTMIN;
145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* not found, so try as a number */
148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		char *endp;
150354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		val = strtol(name, &endp, 10);
151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (*endp || endp == name)
152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return -1;	/* not valid */
153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (val + SIGRTMIN > 127)
155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return -1;	/* not valid */
156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return val + offset;
157e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}
158e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic const char *signal_number_to_name(int signo)
160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	static char buf[32];
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int n = number_of_signals;
163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	signo &= 0x7f;		/* need to process exit values too */
164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while (n--) {
165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (sigtable[n].num == signo)
166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return sigtable[n].name;
167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
168354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (signo == SIGRTMIN)
169354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return "RTMIN";
170354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (signo)
171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(buf, "RTMIN+%d", signo - SIGRTMIN);
172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	else
173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		strcpy(buf, "0");	/* AIX has NULL; Solaris has EXIT */
174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return buf;
175e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}
176e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint print_given_signals(int argc, const char *restrict const *restrict argv,
178354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			int max_line)
179354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char buf[1280];		/* 128 signals, "RTMIN+xx" is largest */
181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int ret = 0;		/* to be used as exit code by caller */
182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int place = 0;		/* position on this line */
183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int amt;
184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (argc > 128)
185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return 1;
186354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while (argc--) {
187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		char tmpbuf[16];
188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		const char *restrict const txt = *argv;
189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (*txt >= '0' && *txt <= '9') {
190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			long val;
191354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			char *endp;
192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			val = strtol(txt, &endp, 10);
193354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (*endp) {
194354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fprintf(stderr, "Signal \"%s\" not known.\n",
195354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					txt);
196354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret = 1;
197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				goto end;
198354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
199354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			amt = sprintf(tmpbuf, "%s", signal_number_to_name(val));
200354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
201354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			int sno;
202354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sno = signal_name_to_number(txt);
203354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (sno == -1) {
204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fprintf(stderr, "Signal \"%s\" not known.\n",
205354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					txt);
206354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret = 1;
207354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				goto end;
208354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			amt = sprintf(tmpbuf, "%d", sno);
210354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
211354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
212354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (!place) {
213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			strcpy(buf, tmpbuf);
214354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			place = amt;
215354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			goto end;
216354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (amt + place + 1 > max_line) {
218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("%s\n", buf);
219354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			strcpy(buf, tmpbuf);
220354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			place = amt;
221354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			goto end;
222354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		sprintf(buf + place, " %s", tmpbuf);
224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		place += amt + 1;
225e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiewend:
226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		argv++;
227354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
228354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (place)
229354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("%s\n", buf);
230354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return ret;
231e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}
232e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
233354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid pretty_print_signals(void)
234354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
235354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int i = 0;
236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while (++i <= number_of_signals) {
237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		int n;
238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		n = printf("%2d %s", i, signal_number_to_name(i));
239354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (i % 7)
240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("           \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     + n);
243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		else
244354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("\n");
245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
246354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((i - 1) % 7)
247354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("\n");
248e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}
249e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
250354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid unix_print_signals(void)
251354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
252354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int pos = 0;
253354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int i = 0;
254354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	while (++i <= number_of_signals) {
255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (i - 1)
256354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("%c",
257354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       (pos > 73) ? (pos = 0, '\n') : (pos++, ' '));
258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		pos += printf("%s", signal_number_to_name(i));
259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	printf("\n");
261e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew}
262e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew
263e9b9da48821c79cab08be6f8b30a4d75584ebd47robbiew/* sanity check */
264354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int init_signal_list(void) __attribute__ ((constructor));
265354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int init_signal_list(void)
266354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
267354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (number_of_signals != 31) {
268354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		fprintf(stderr,
269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			"WARNING: %d signals -- adjust and recompile.\n",
270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			number_of_signals);
271354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
272354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return 0;
273ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
274