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
| | #include <signal.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
int str2sig(const char *restrict str, int *restrict pnum)
{
if (str[0] == '\0') return -1;
errno = 0;
long signum = strtol(str, NULL, 10);
if (errno == 0 && signum < _NSIG) return (*pnum = signum, 0);
if (strnlen(str, sizeof *__sys_signame) <= sizeof *__sys_signame)
for (int i = 0; i < sizeof __sys_signame/sizeof *__sys_signame; i++)
if (strncmp(str, __sys_signame[i], sizeof *__sys_signame) == 0)
return (*pnum = i, 0);
// signal aliases
if (strcmp(str, "IOT") == 0)
return (*pnum = SIGIOT, 0);
if (strcmp(str, "UNUSED") == 0)
return (*pnum = SIGUNUSED, 0);
#if SIGPOLL != SIGIO
if (strcmp(str, "POLL") == 0)
return (*pnum = SIGPOLL, 0);
#endif
if (strcmp(str, "RTMIN") == 0)
return (*pnum = SIGRTMIN, 0);
if (strcmp(str, "RTMAX") == 0)
return (*pnum = SIGRTMAX, 0);
if (strncmp(str, "RTMIN+", 6) == 0 || strncmp(str, "RTMAX-", 6) == 0)
{
errno = 0;
long sigrt = strtol(str+6, NULL, 10);
if(errno != 0 || sigrt < 1 || sigrt > SIGRTMAX - SIGRTMIN) return -1;
*pnum = str[5] == '+' ? SIGRTMIN + sigrt : SIGRTMAX - sigrt;
return 0;
}
return -1;
}
|