Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1+ */
2 :
3 : #include <signal.h>
4 : #include <unistd.h>
5 :
6 : #include "log.h"
7 : #include "macro.h"
8 : #include "signal-util.h"
9 : #include "stdio-util.h"
10 : #include "string-util.h"
11 : #include "process-util.h"
12 :
13 : #define info(sig) log_info(#sig " = " STRINGIFY(sig) " = %d", sig)
14 :
15 1 : static void test_rt_signals(void) {
16 1 : info(SIGRTMIN);
17 1 : info(SIGRTMAX);
18 :
19 : /* We use signals SIGRTMIN+0 to SIGRTMIN+24 unconditionally */
20 1 : assert(SIGRTMAX - SIGRTMIN >= 24);
21 1 : }
22 :
23 5 : static void test_signal_to_string_one(int val) {
24 : const char *p;
25 :
26 5 : assert_se(p = signal_to_string(val));
27 :
28 5 : assert_se(signal_from_string(p) == val);
29 :
30 25 : p = strjoina("SIG", p);
31 5 : assert_se(signal_from_string(p) == val);
32 5 : }
33 :
34 28 : static void test_signal_from_string_one(const char *s, int val) {
35 : const char *p;
36 :
37 28 : assert_se(signal_from_string(s) == val);
38 :
39 140 : p = strjoina("SIG", s);
40 28 : assert_se(signal_from_string(p) == val);
41 28 : }
42 :
43 5 : static void test_signal_from_string_number(const char *s, int val) {
44 : const char *p;
45 :
46 5 : assert_se(signal_from_string(s) == val);
47 :
48 25 : p = strjoina("SIG", s);
49 5 : assert_se(signal_from_string(p) == -EINVAL);
50 5 : }
51 :
52 1 : static void test_signal_from_string(void) {
53 : char buf[STRLEN("RTMIN+") + DECIMAL_STR_MAX(int) + 1];
54 :
55 1 : test_signal_to_string_one(SIGHUP);
56 1 : test_signal_to_string_one(SIGTERM);
57 1 : test_signal_to_string_one(SIGRTMIN);
58 1 : test_signal_to_string_one(SIGRTMIN+3);
59 1 : test_signal_to_string_one(SIGRTMAX-4);
60 :
61 1 : test_signal_from_string_one("RTMIN", SIGRTMIN);
62 1 : test_signal_from_string_one("RTMAX", SIGRTMAX);
63 :
64 1 : xsprintf(buf, "RTMIN+%d", SIGRTMAX-SIGRTMIN);
65 1 : test_signal_from_string_one(buf, SIGRTMAX);
66 :
67 1 : xsprintf(buf, "RTMIN+%d", INT_MAX);
68 1 : test_signal_from_string_one(buf, -ERANGE);
69 :
70 1 : xsprintf(buf, "RTMAX-%d", SIGRTMAX-SIGRTMIN);
71 1 : test_signal_from_string_one(buf, SIGRTMIN);
72 :
73 1 : xsprintf(buf, "RTMAX-%d", INT_MAX);
74 1 : test_signal_from_string_one(buf, -ERANGE);
75 :
76 1 : test_signal_from_string_one("", -EINVAL);
77 1 : test_signal_from_string_one("hup", -EINVAL);
78 1 : test_signal_from_string_one("HOGEHOGE", -EINVAL);
79 :
80 1 : test_signal_from_string_one("RTMIN-5", -EINVAL);
81 1 : test_signal_from_string_one("RTMIN- 5", -EINVAL);
82 1 : test_signal_from_string_one("RTMIN -5", -EINVAL);
83 1 : test_signal_from_string_one("RTMIN+ 5", -EINVAL);
84 1 : test_signal_from_string_one("RTMIN +5", -EINVAL);
85 1 : test_signal_from_string_one("RTMIN+100", -ERANGE);
86 1 : test_signal_from_string_one("RTMIN+-3", -EINVAL);
87 1 : test_signal_from_string_one("RTMIN++3", -EINVAL);
88 1 : test_signal_from_string_one("RTMIN+HUP", -EINVAL);
89 1 : test_signal_from_string_one("RTMIN3", -EINVAL);
90 :
91 1 : test_signal_from_string_one("RTMAX+5", -EINVAL);
92 1 : test_signal_from_string_one("RTMAX+ 5", -EINVAL);
93 1 : test_signal_from_string_one("RTMAX +5", -EINVAL);
94 1 : test_signal_from_string_one("RTMAX- 5", -EINVAL);
95 1 : test_signal_from_string_one("RTMAX -5", -EINVAL);
96 1 : test_signal_from_string_one("RTMAX-100", -ERANGE);
97 1 : test_signal_from_string_one("RTMAX-+3", -EINVAL);
98 1 : test_signal_from_string_one("RTMAX--3", -EINVAL);
99 1 : test_signal_from_string_one("RTMAX-HUP", -EINVAL);
100 :
101 1 : test_signal_from_string_number("3", 3);
102 1 : test_signal_from_string_number("+5", 5);
103 1 : test_signal_from_string_number(" +5", 5);
104 1 : test_signal_from_string_number("10000", -ERANGE);
105 1 : test_signal_from_string_number("-2", -ERANGE);
106 1 : }
107 :
108 1 : static void test_block_signals(void) {
109 : sigset_t ss;
110 :
111 1 : assert_se(sigprocmask(0, NULL, &ss) >= 0);
112 :
113 1 : assert_se(sigismember(&ss, SIGUSR1) == 0);
114 1 : assert_se(sigismember(&ss, SIGALRM) == 0);
115 1 : assert_se(sigismember(&ss, SIGVTALRM) == 0);
116 :
117 : {
118 2 : BLOCK_SIGNALS(SIGUSR1, SIGVTALRM);
119 :
120 1 : assert_se(sigprocmask(0, NULL, &ss) >= 0);
121 1 : assert_se(sigismember(&ss, SIGUSR1) == 1);
122 1 : assert_se(sigismember(&ss, SIGALRM) == 0);
123 1 : assert_se(sigismember(&ss, SIGVTALRM) == 1);
124 :
125 : }
126 :
127 1 : assert_se(sigprocmask(0, NULL, &ss) >= 0);
128 1 : assert_se(sigismember(&ss, SIGUSR1) == 0);
129 1 : assert_se(sigismember(&ss, SIGALRM) == 0);
130 1 : assert_se(sigismember(&ss, SIGVTALRM) == 0);
131 1 : }
132 :
133 1 : static void test_ignore_signals(void) {
134 1 : assert_se(ignore_signals(SIGINT, -1) >= 0);
135 1 : assert_se(kill(getpid_cached(), SIGINT) >= 0);
136 1 : assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
137 1 : assert_se(kill(getpid_cached(), SIGUSR1) >= 0);
138 1 : assert_se(kill(getpid_cached(), SIGUSR2) >= 0);
139 1 : assert_se(kill(getpid_cached(), SIGTERM) >= 0);
140 1 : assert_se(kill(getpid_cached(), SIGPIPE) >= 0);
141 1 : assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
142 1 : }
143 :
144 1 : int main(int argc, char *argv[]) {
145 1 : test_rt_signals();
146 1 : test_signal_from_string();
147 1 : test_block_signals();
148 1 : test_ignore_signals();
149 :
150 1 : return 0;
151 : }
|