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
|
--- src/ucs/config/parser.c.orig 2026-09-09 02:32:02 UTC
+++ src/ucs/config/parser.c
@@ -27,6 +27,7 @@
#include <ctype.h>
#include <libgen.h>
#include <regex.h>
+#include <signal.h>
/* width of titles in docstring */
@@ -697,6 +698,8 @@ int ucs_config_sscanf_signo(const char *buf, void *des
int ucs_config_sscanf_signo(const char *buf, void *dest, const void *arg)
{
char *endptr;
+ const char *name;
+ const char *name_nosig;
int signo;
signo = strtol(buf, &endptr, 10);
@@ -705,11 +708,31 @@ int ucs_config_sscanf_signo(const char *buf, void *des
return 1;
}
- if (!strncmp(buf, "SIG", 3)) {
- buf += 3;
+ name = buf;
+ if (!strncasecmp(name, "SIG", 3)) {
+ name_nosig = name + 3;
+ } else {
+ name_nosig = name;
}
- return ucs_config_sscanf_enum(buf, dest, ucs_signal_names);
+#if defined(__FreeBSD__)
+ for (signo = 1; signo < NSIG; ++signo) {
+ if ((sys_signame[signo] != NULL) &&
+ !strcasecmp(name_nosig, sys_signame[signo])) {
+ *(int*)dest = signo;
+ return 1;
+ }
+ }
+#endif
+
+ if (ucs_config_sscanf_enum(name_nosig, dest, ucs_signal_names)) {
+ return 1;
+ }
+ if (name_nosig != name) {
+ return ucs_config_sscanf_enum(name, dest, ucs_signal_names);
+ }
+
+ return 0;
}
int ucs_config_sprintf_signo(char *buf, size_t max,
|