1/* See LICENSE file for copyright and license details. */
2#include "../sig.h"
3
4#include <signal.h>
5#include <stdlib.h>
6#include <string.h>
7#include <strings.h>
8
9const char *const aruu_sys_signame[NSIG] = {
10 [0] = "EXIT",
11#ifdef SIGHUP
12 [SIGHUP] = "HUP",
13#endif
14#ifdef SIGINT
15 [SIGINT] = "INT",
16#endif
17#ifdef SIGQUIT
18 [SIGQUIT] = "QUIT",
19#endif
20#ifdef SIGILL
21 [SIGILL] = "ILL",
22#endif
23#ifdef SIGTRAP
24 [SIGTRAP] = "TRAP",
25#endif
26#ifdef SIGABRT
27 [SIGABRT] = "ABRT",
28#endif
29#ifdef SIGBUS
30 [SIGBUS] = "BUS",
31#endif
32#ifdef SIGFPE
33 [SIGFPE] = "FPE",
34#endif
35#ifdef SIGKILL
36 [SIGKILL] = "KILL",
37#endif
38#ifdef SIGUSR1
39 [SIGUSR1] = "USR1",
40#endif
41#ifdef SIGSEGV
42 [SIGSEGV] = "SEGV",
43#endif
44#ifdef SIGUSR2
45 [SIGUSR2] = "USR2",
46#endif
47#ifdef SIGPIPE
48 [SIGPIPE] = "PIPE",
49#endif
50#ifdef SIGALRM
51 [SIGALRM] = "ALRM",
52#endif
53#ifdef SIGTERM
54 [SIGTERM] = "TERM",
55#endif
56#ifdef SIGCHLD
57 [SIGCHLD] = "CHLD",
58#endif
59#ifdef SIGCONT
60 [SIGCONT] = "CONT",
61#endif
62#ifdef SIGSTOP
63 [SIGSTOP] = "STOP",
64#endif
65#ifdef SIGTSTP
66 [SIGTSTP] = "TSTP",
67#endif
68#ifdef SIGTTIN
69 [SIGTTIN] = "TTIN",
70#endif
71#ifdef SIGTTOU
72 [SIGTTOU] = "TTOU",
73#endif
74#ifdef SIGURG
75 [SIGURG] = "URG",
76#endif
77#ifdef SIGXCPU
78 [SIGXCPU] = "XCPU",
79#endif
80#ifdef SIGXFSZ
81 [SIGXFSZ] = "XFSZ",
82#endif
83#ifdef SIGVTALRM
84 [SIGVTALRM] = "VTALRM",
85#endif
86#ifdef SIGPROF
87 [SIGPROF] = "PROF",
88#endif
89#ifdef SIGWINCH
90 [SIGWINCH] = "WINCH",
91#endif
92#ifdef SIGIO
93 [SIGIO] = "IO",
94#endif
95#ifdef SIGPWR
96 [SIGPWR] = "PWR",
97#endif
98#ifdef SIGSYS
99 [SIGSYS] = "SYS",
100#endif
101};
102
103const int aruu_sys_nsig = NSIG;
104
105int
106aruu_sig2str(int signo, char *str)
107{
108 const char *name;
109
110#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
111 || defined(__APPLE__)
112 if (signo <= 0 || signo >= sys_nsig)
113 return -1;
114 name = sys_signame[signo];
115#else
116 if (signo <= 0 || signo >= aruu_sys_nsig)
117 return -1;
118 name = aruu_sys_signame[signo];
119#endif
120
121 if (name == NULL)
122 return -1;
123 strcpy(str, name);
124 return 0;
125}
126
127int
128aruu_str2sig(const char *str, int *signop)
129{
130 int n;
131 const char *s = str;
132 const char *const *table;
133 int limit;
134
135#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
136 || defined(__APPLE__)
137 table = sys_signame;
138 limit = sys_nsig;
139#else
140 table = aruu_sys_signame;
141 limit = aruu_sys_nsig;
142#endif
143
144 if (strncasecmp(s, "SIG", 3) == 0)
145 s += 3;
146
147 /* check if it is a number */
148 char *ep;
149 long l = strtol(s, &ep, 10);
150 if (*s && !*ep) {
151 if (l >= 0 && l < limit) {
152 *signop = (int)l;
153 return 0;
154 }
155 return -1;
156 }
157
158 for (n = 1; n < limit; n++) {
159 if (table[n] && strcasecmp(table[n], s) == 0) {
160 *signop = n;
161 return 0;
162 }
163 }
164 return -1;
165}