source: MondoRescue/branches/2.2.9/mindi-busybox/libbb/u_signal_names.c@ 2725

Last change on this file since 2725 was 2725, checked in by Bruno Cornec, 13 years ago
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File size: 3.4 KB
RevLine 
[821]1/* vi: set sw=4 ts=4: */
2/*
[1765]3 * Signal name/number conversion routines.
[821]4 *
[1765]5 * Copyright 2006 Rob Landley <rob@landley.net>
[821]6 *
[2725]7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
[821]8 */
9
10#include "libbb.h"
11
[2725]12/* Believe it or not, but some arches have more than 32 SIGs!
13 * HPPA: SIGSTKFLT == 36. */
14
15static const char signals[][7] = {
[1765]16 // SUSv3 says kill must support these, and specifies the numerical values,
17 // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
18 // {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"},
19 // {6, "ABRT"}, {9, "KILL"}, {14, "ALRM"}, {15, "TERM"}
20 // And Posix adds the following:
21 // {SIGILL, "ILL"}, {SIGTRAP, "TRAP"}, {SIGFPE, "FPE"}, {SIGUSR1, "USR1"},
22 // {SIGSEGV, "SEGV"}, {SIGUSR2, "USR2"}, {SIGPIPE, "PIPE"}, {SIGCHLD, "CHLD"},
23 // {SIGCONT, "CONT"}, {SIGSTOP, "STOP"}, {SIGTSTP, "TSTP"}, {SIGTTIN, "TTIN"},
24 // {SIGTTOU, "TTOU"}
[2725]25
[1765]26 [0] = "EXIT",
27#ifdef SIGHUP
28 [SIGHUP ] = "HUP",
29#endif
30#ifdef SIGINT
31 [SIGINT ] = "INT",
32#endif
33#ifdef SIGQUIT
34 [SIGQUIT ] = "QUIT",
35#endif
36#ifdef SIGILL
37 [SIGILL ] = "ILL",
38#endif
[821]39#ifdef SIGTRAP
[1765]40 [SIGTRAP ] = "TRAP",
[821]41#endif
[1765]42#ifdef SIGABRT
43 [SIGABRT ] = "ABRT",
[821]44#endif
45#ifdef SIGBUS
[1765]46 [SIGBUS ] = "BUS",
[821]47#endif
[1765]48#ifdef SIGFPE
49 [SIGFPE ] = "FPE",
[821]50#endif
[1765]51#ifdef SIGKILL
52 [SIGKILL ] = "KILL",
53#endif
54#ifdef SIGUSR1
55 [SIGUSR1 ] = "USR1",
56#endif
57#ifdef SIGSEGV
58 [SIGSEGV ] = "SEGV",
59#endif
60#ifdef SIGUSR2
61 [SIGUSR2 ] = "USR2",
62#endif
63#ifdef SIGPIPE
64 [SIGPIPE ] = "PIPE",
65#endif
66#ifdef SIGALRM
67 [SIGALRM ] = "ALRM",
68#endif
69#ifdef SIGTERM
70 [SIGTERM ] = "TERM",
71#endif
[821]72#ifdef SIGSTKFLT
[1765]73 [SIGSTKFLT] = "STKFLT",
[821]74#endif
[1765]75#ifdef SIGCHLD
76 [SIGCHLD ] = "CHLD",
[821]77#endif
[1765]78#ifdef SIGCONT
79 [SIGCONT ] = "CONT",
[821]80#endif
[1765]81#ifdef SIGSTOP
82 [SIGSTOP ] = "STOP",
[821]83#endif
[1765]84#ifdef SIGTSTP
85 [SIGTSTP ] = "TSTP",
[821]86#endif
[1765]87#ifdef SIGTTIN
88 [SIGTTIN ] = "TTIN",
89#endif
90#ifdef SIGTTOU
91 [SIGTTOU ] = "TTOU",
92#endif
93#ifdef SIGURG
94 [SIGURG ] = "URG",
95#endif
[821]96#ifdef SIGXCPU
[1765]97 [SIGXCPU ] = "XCPU",
[821]98#endif
99#ifdef SIGXFSZ
[1765]100 [SIGXFSZ ] = "XFSZ",
[821]101#endif
102#ifdef SIGVTALRM
[1765]103 [SIGVTALRM] = "VTALRM",
[821]104#endif
105#ifdef SIGPROF
[1765]106 [SIGPROF ] = "PROF",
[821]107#endif
[1765]108#ifdef SIGWINCH
109 [SIGWINCH ] = "WINCH",
110#endif
111#ifdef SIGPOLL
112 [SIGPOLL ] = "POLL",
113#endif
[821]114#ifdef SIGPWR
[1765]115 [SIGPWR ] = "PWR",
[821]116#endif
[1765]117#ifdef SIGSYS
118 [SIGSYS ] = "SYS",
[821]119#endif
[1765]120};
121
122// Convert signal name to number.
123
[2725]124int FAST_FUNC get_signum(const char *name)
[1765]125{
[2725]126 unsigned i;
[1765]127
128 i = bb_strtou(name, NULL, 10);
129 if (!errno)
130 return i;
131 if (strncasecmp(name, "SIG", 3) == 0)
132 name += 3;
133 for (i = 0; i < ARRAY_SIZE(signals); i++)
134 if (strcasecmp(name, signals[i]) == 0)
135 return i;
136
137#if ENABLE_DESKTOP && (defined(SIGIOT) || defined(SIGIO))
[2725]138 /* SIGIO[T] are aliased to other names,
139 * thus cannot be stored in the signals[] array.
140 * Need special code to recognize them */
[1765]141 if ((name[0] | 0x20) == 'i' && (name[1] | 0x20) == 'o') {
142#ifdef SIGIO
143 if (!name[2])
144 return SIGIO;
[821]145#endif
[1765]146#ifdef SIGIOT
147 if ((name[2] | 0x20) == 't' && !name[3])
148 return SIGIOT;
[821]149#endif
[1765]150 }
[821]151#endif
152
[1765]153 return -1;
154}
[821]155
[1765]156// Convert signal number to name
[821]157
[2725]158const char* FAST_FUNC get_signame(int number)
[821]159{
[1765]160 if ((unsigned)number < ARRAY_SIZE(signals)) {
161 if (signals[number][0]) /* if it's not an empty str */
162 return signals[number];
163 }
[821]164
[1765]165 return itoa(number);
[821]166}
[2725]167
168
169// Print the whole signal list
170
171void FAST_FUNC print_signames(void)
172{
173 unsigned signo;
174
175 for (signo = 1; signo < ARRAY_SIZE(signals); signo++) {
176 const char *name = signals[signo];
177 if (name[0])
178 puts(name);
179 }
180}
Note: See TracBrowser for help on using the repository browser.