signame.c (3169B) download
1#include "signame.h"
2
3#include "util.h"
4
5#include <signal.h>
6#include <stdlib.h>
7#include <string.h>
8
9#define SIGNUM_NAME(name) \
10 { SIG##name, #name }
11
12static struct {
13 int num;
14 const char* name;
15} signals[] = {
16/* Signals required by POSIX 1003.1-2001 base, listed in
17 traditional numeric order where possible. */
18#ifdef SIGHUP
19 SIGNUM_NAME(HUP),
20#endif
21#ifdef SIGINT
22 SIGNUM_NAME(INT),
23#endif
24#ifdef SIGQUIT
25 SIGNUM_NAME(QUIT),
26#endif
27#ifdef SIGILL
28 SIGNUM_NAME(ILL),
29#endif
30#ifdef SIGTRAP
31 SIGNUM_NAME(TRAP),
32#endif
33#ifdef SIGABRT
34 SIGNUM_NAME(ABRT),
35#endif
36#ifdef SIGFPE
37 SIGNUM_NAME(FPE),
38#endif
39#ifdef SIGKILL
40 SIGNUM_NAME(KILL),
41#endif
42#ifdef SIGSEGV
43 SIGNUM_NAME(SEGV),
44#endif
45/* On Haiku, SIGSEGV == SIGBUS, but we prefer SIGSEGV to match
46 strsignal.c output, so SIGBUS must be listed second. */
47#ifdef SIGBUS
48 SIGNUM_NAME(BUS),
49#endif
50#ifdef SIGPIPE
51 SIGNUM_NAME(PIPE),
52#endif
53#ifdef SIGALRM
54 SIGNUM_NAME(ALRM),
55#endif
56#ifdef SIGTERM
57 SIGNUM_NAME(TERM),
58#endif
59#ifdef SIGUSR1
60 SIGNUM_NAME(USR1),
61#endif
62#ifdef SIGUSR2
63 SIGNUM_NAME(USR2),
64#endif
65#ifdef SIGCHLD
66 SIGNUM_NAME(CHLD),
67#endif
68#ifdef SIGURG
69 SIGNUM_NAME(URG),
70#endif
71#ifdef SIGSTOP
72 SIGNUM_NAME(STOP),
73#endif
74#ifdef SIGTSTP
75 SIGNUM_NAME(TSTP),
76#endif
77#ifdef SIGCONT
78 SIGNUM_NAME(CONT),
79#endif
80#ifdef SIGTTIN
81 SIGNUM_NAME(TTIN),
82#endif
83#ifdef SIGTTOU
84 SIGNUM_NAME(TTOU),
85#endif
86
87/* Signals required by POSIX 1003.1-2001 with the XSI extension. */
88#ifdef SIGSYS
89 SIGNUM_NAME(SYS),
90#endif
91#ifdef SIGPOLL
92 SIGNUM_NAME(POLL),
93#endif
94#ifdef SIGVTALRM
95 SIGNUM_NAME(VTALRM),
96#endif
97#ifdef SIGPROF
98 SIGNUM_NAME(PROF),
99#endif
100#ifdef SIGXCPU
101 SIGNUM_NAME(XCPU),
102#endif
103#ifdef SIGXFSZ
104 SIGNUM_NAME(XFSZ),
105#endif
106
107/* Unix Version 7. */
108#ifdef SIGIOT
109 SIGNUM_NAME(IOT), /* Older name for ABRT. */
110#endif
111#ifdef SIGEMT
112 SIGNUM_NAME(EMT),
113#endif
114
115/* USG Unix. */
116#ifdef SIGPHONE
117 SIGNUM_NAME(PHONE),
118#endif
119#ifdef SIGWIND
120 SIGNUM_NAME(WIND),
121#endif
122
123/* Unix System V. */
124#ifdef SIGCLD
125 SIGNUM_NAME(CLD),
126#endif
127#ifdef SIGPWR
128 SIGNUM_NAME(PWR),
129#endif
130
131/* GNU/Linux 2.2 and Solaris 8. */
132#ifdef SIGCANCEL
133 SIGNUM_NAME(CANCEL),
134#endif
135#ifdef SIGLWP
136 SIGNUM_NAME(LWP),
137#endif
138#ifdef SIGWAITING
139 SIGNUM_NAME(WAITING),
140#endif
141#ifdef SIGFREEZE
142 SIGNUM_NAME(FREEZE),
143#endif
144#ifdef SIGTHAW
145 SIGNUM_NAME(THAW),
146#endif
147#ifdef SIGLOST
148 SIGNUM_NAME(LOST),
149#endif
150#ifdef SIGWINCH
151 SIGNUM_NAME(WINCH),
152#endif
153
154/* GNU/Linux 2.2. */
155#ifdef SIGINFO
156 SIGNUM_NAME(INFO),
157#endif
158#ifdef SIGIO
159 SIGNUM_NAME(IO),
160#endif
161#ifdef SIGSTKFLT
162 SIGNUM_NAME(STKFLT),
163#endif
164
165/* OpenBSD. */
166#ifdef SIGTHR
167 SIGNUM_NAME(THR),
168#endif
169};
170
171int signame(char const* name) {
172 char* endptr;
173 int signum;
174
175 if ((signum = strtol(name, &endptr, 10)) && endptr == strchr(name, '\0'))
176 return signum;
177
178 // startswith SIG, remove that so -SIGKILL == -KILL
179 if (strncmp(name, "SIG", 3) == 0) {
180 name += 3;
181 }
182
183 // search for name
184 for (int i = 0; i < (int) LEN(signals); i++)
185 if (streq(signals[i].name, name))
186 return signals[i].num;
187
188 return -1;
189}
190
191const char* sigabbr(int signal) {
192 // search for name
193 for (int i = 0; i < (int) LEN(signals); i++)
194 if (signals[i].num == signal)
195 return signals[i].name;
196
197 return "UNKNOWN";
198}