aboutsummaryrefslogtreecommitdiff
path: root/libbb/u_signal_names.c
blob: 43015b7a13265536efdb44ba67ea2eab534d1a03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/* vi: set sw=4 ts=4: */
/*
 * Signal name/number conversion routines.
 *
 * Copyright 2006 Rob Landley <rob@landley.net>
 *
 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
 */

#include "libbb.h"

#define KILL_MAX_SIG 32

static const char signals[KILL_MAX_SIG][7] = {
	// SUSv3 says kill must support these, and specifies the numerical values,
	// http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
	// TODO: "[SIG]EXIT" shouldn't work for kill, right?
	// {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"},
	// {6, "ABRT"}, {9, "KILL"}, {14, "ALRM"}, {15, "TERM"}
	// And Posix adds the following:
	// {SIGILL, "ILL"}, {SIGTRAP, "TRAP"}, {SIGFPE, "FPE"}, {SIGUSR1, "USR1"},
	// {SIGSEGV, "SEGV"}, {SIGUSR2, "USR2"}, {SIGPIPE, "PIPE"}, {SIGCHLD, "CHLD"},
	// {SIGCONT, "CONT"}, {SIGSTOP, "STOP"}, {SIGTSTP, "TSTP"}, {SIGTTIN, "TTIN"},
	// {SIGTTOU, "TTOU"}

/* Believe it or not, but some arches have more than 32 SIGs!
 * HPPA: SIGSTKFLT == 36. We don't include those. */
	[0] = "EXIT",
#if defined SIGHUP && SIGHUP < KILL_MAX_SIG
	[SIGHUP   ] = "HUP",
#endif
#if defined SIGINT && SIGINT < KILL_MAX_SIG
	[SIGINT   ] = "INT",
#endif
#if defined SIGQUIT && SIGQUIT < KILL_MAX_SIG
	[SIGQUIT  ] = "QUIT",
#endif
#if defined SIGILL && SIGILL < KILL_MAX_SIG
	[SIGILL   ] = "ILL",
#endif
#if defined SIGTRAP && SIGTRAP < KILL_MAX_SIG
	[SIGTRAP  ] = "TRAP",
#endif
#if defined SIGABRT && SIGABRT < KILL_MAX_SIG
	[SIGABRT  ] = "ABRT",
#endif
#if defined SIGBUS && SIGBUS < KILL_MAX_SIG
	[SIGBUS   ] = "BUS",
#endif
#if defined SIGFPE && SIGFPE < KILL_MAX_SIG
	[SIGFPE   ] = "FPE",
#endif
#if defined SIGKILL && SIGKILL < KILL_MAX_SIG
	[SIGKILL  ] = "KILL",
#endif
#if defined SIGUSR1 && SIGUSR1 < KILL_MAX_SIG
	[SIGUSR1  ] = "USR1",
#endif
#if defined SIGSEGV && SIGSEGV < KILL_MAX_SIG
	[SIGSEGV  ] = "SEGV",
#endif
#if defined SIGUSR2 && SIGUSR2 < KILL_MAX_SIG
	[SIGUSR2  ] = "USR2",
#endif
#if defined SIGPIPE && SIGPIPE < KILL_MAX_SIG
	[SIGPIPE  ] = "PIPE",
#endif
#if defined SIGALRM && SIGALRM < KILL_MAX_SIG
	[SIGALRM  ] = "ALRM",
#endif
#if defined SIGTERM && SIGTERM < KILL_MAX_SIG
	[SIGTERM  ] = "TERM",
#endif
#if defined SIGSTKFLT && SIGSTKFLT < KILL_MAX_SIG
	[SIGSTKFLT] = "STKFLT",
#endif
#if defined SIGCHLD && SIGCHLD < KILL_MAX_SIG
	[SIGCHLD  ] = "CHLD",
#endif
#if defined SIGCONT && SIGCONT < KILL_MAX_SIG
	[SIGCONT  ] = "CONT",
#endif
#if defined SIGSTOP && SIGSTOP < KILL_MAX_SIG
	[SIGSTOP  ] = "STOP",
#endif
#if defined SIGTSTP && SIGTSTP < KILL_MAX_SIG
	[SIGTSTP  ] = "TSTP",
#endif
#if defined SIGTTIN && SIGTTIN < KILL_MAX_SIG
	[SIGTTIN  ] = "TTIN",
#endif
#if defined SIGTTOU && SIGTTOU < KILL_MAX_SIG
	[SIGTTOU  ] = "TTOU",
#endif
#if defined SIGURG && SIGURG < KILL_MAX_SIG
	[SIGURG   ] = "URG",
#endif
#if defined SIGXCPU && SIGXCPU < KILL_MAX_SIG
	[SIGXCPU  ] = "XCPU",
#endif
#if defined SIGXFSZ && SIGXFSZ < KILL_MAX_SIG
	[SIGXFSZ  ] = "XFSZ",
#endif
#if defined SIGVTALRM && SIGVTALRM < KILL_MAX_SIG
	[SIGVTALRM] = "VTALRM",
#endif
#if defined SIGPROF && SIGPROF < KILL_MAX_SIG
	[SIGPROF  ] = "PROF",
#endif
#if defined SIGWINCH && SIGWINCH < KILL_MAX_SIG
	[SIGWINCH ] = "WINCH",
#endif
#if defined SIGPOLL && SIGPOLL < KILL_MAX_SIG
	[SIGPOLL  ] = "POLL",
#endif
#if defined SIGPWR && SIGPWR < KILL_MAX_SIG
	[SIGPWR   ] = "PWR",
#endif
#if defined SIGSYS && SIGSYS < KILL_MAX_SIG
	[SIGSYS   ] = "SYS",
#endif
};

// Convert signal name to number.

int get_signum(const char *name)
{
	int i;

	i = bb_strtou(name, NULL, 10);
	if (!errno)
		return i;
	if (strncasecmp(name, "SIG", 3) == 0)
		name += 3;
	for (i = 0; i < ARRAY_SIZE(signals); i++)
		if (strcasecmp(name, signals[i]) == 0)
			return i;

#if ENABLE_DESKTOP && (defined(SIGIOT) || defined(SIGIO))
	/* These are aliased to other names */
	if ((name[0] | 0x20) == 'i' && (name[1] | 0x20) == 'o') {
#if defined SIGIO
		if (!name[2])
			return SIGIO;
#endif
#if defined SIGIOT
		if ((name[2] | 0x20) == 't' && !name[3])
			return SIGIOT;
#endif
	}
#endif

	return -1;
}

// Convert signal number to name

const char *get_signame(int number)
{
	if ((unsigned)number < ARRAY_SIZE(signals)) {
		if (signals[number][0]) /* if it's not an empty str */
			return signals[number];
	}

	return itoa(number);
}


// Print the whole signal list

void print_signames(void)
{
	int signo;

	for (signo = 1; signo < ARRAY_SIZE(signals); signo++) {
		const char *name = signals[signo];
		if (name[0])
			puts(name);
	}
}