1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
7 Copyright 2013 Thomas H.P. Andersen
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
29 #include <sys/types.h>
31 #include <sys/xattr.h>
34 #include "conf-parser.h"
35 #include "cpu-set-util.h"
42 #include "parse-util.h"
43 #include "process-util.h"
45 #include "signal-util.h"
46 #include "string-util.h"
48 #include "user-util.h"
52 static void test_streq_ptr(void) {
53 assert_se(streq_ptr(NULL
, NULL
));
54 assert_se(!streq_ptr("abc", "cdef"));
57 static void test_align_power2(void) {
60 assert_se(ALIGN_POWER2(0) == 0);
61 assert_se(ALIGN_POWER2(1) == 1);
62 assert_se(ALIGN_POWER2(2) == 2);
63 assert_se(ALIGN_POWER2(3) == 4);
64 assert_se(ALIGN_POWER2(12) == 16);
66 assert_se(ALIGN_POWER2(ULONG_MAX
) == 0);
67 assert_se(ALIGN_POWER2(ULONG_MAX
- 1) == 0);
68 assert_se(ALIGN_POWER2(ULONG_MAX
- 1024) == 0);
69 assert_se(ALIGN_POWER2(ULONG_MAX
/ 2) == ULONG_MAX
/ 2 + 1);
70 assert_se(ALIGN_POWER2(ULONG_MAX
+ 1) == 0);
72 for (i
= 1; i
< 131071; ++i
) {
73 for (p2
= 1; p2
< i
; p2
<<= 1)
76 assert_se(ALIGN_POWER2(i
) == p2
);
79 for (i
= ULONG_MAX
- 1024; i
< ULONG_MAX
; ++i
) {
80 for (p2
= 1; p2
&& p2
< i
; p2
<<= 1)
83 assert_se(ALIGN_POWER2(i
) == p2
);
87 static void test_max(void) {
90 int b
[CONST_MAX(10, 100)];
92 .a
= CONST_MAX(10, 100),
96 assert_cc(sizeof(val1
.b
) == sizeof(int) * 100);
98 /* CONST_MAX returns (void) instead of a value if the passed arguments
99 * are not of the same type or not constant expressions. */
100 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
101 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
103 assert_se(val1
.a
== 100);
104 assert_se(MAX(++d
, 0) == 1);
107 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
108 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
109 assert_cc(MAXSIZE(char, long) == sizeof(long));
111 assert_se(MAX(-5, 5) == 5);
112 assert_se(MAX(5, 5) == 5);
113 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
114 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
115 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
116 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
117 assert_se(LESS_BY(8, 4) == 4);
118 assert_se(LESS_BY(8, 8) == 0);
119 assert_se(LESS_BY(4, 8) == 0);
120 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
121 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
122 assert_se(CLAMP(-5, 0, 1) == 0);
123 assert_se(CLAMP(5, 0, 1) == 1);
124 assert_se(CLAMP(5, -10, 1) == 1);
125 assert_se(CLAMP(5, -10, 10) == 5);
126 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
129 static void test_container_of(void) {
135 } _packed_ myval
= { };
137 assert_cc(sizeof(myval
) == 17);
138 assert_se(container_of(&myval
.v1
, struct mytype
, v1
) == &myval
);
139 assert_se(container_of(&myval
.v2
, struct mytype
, v2
) == &myval
);
140 assert_se(container_of(&container_of(&myval
.v2
,
147 static void test_alloca(void) {
148 static const uint8_t zero
[997] = { };
151 t
= alloca_align(17, 512);
152 assert_se(!((uintptr_t)t
& 0xff));
155 t
= alloca0_align(997, 1024);
156 assert_se(!((uintptr_t)t
& 0x1ff));
157 assert_se(!memcmp(t
, zero
, 997));
160 static void test_div_round_up(void) {
164 assert_se(DIV_ROUND_UP(0, 8) == 0);
165 assert_se(DIV_ROUND_UP(1, 8) == 1);
166 assert_se(DIV_ROUND_UP(8, 8) == 1);
167 assert_se(DIV_ROUND_UP(12, 8) == 2);
168 assert_se(DIV_ROUND_UP(16, 8) == 2);
170 /* test multiple evaluation */
172 assert_se(DIV_ROUND_UP(div
++, 8) == 0 && div
== 1);
173 assert_se(DIV_ROUND_UP(++div
, 8) == 1 && div
== 2);
174 assert_se(DIV_ROUND_UP(8, div
++) == 4 && div
== 3);
175 assert_se(DIV_ROUND_UP(8, ++div
) == 2 && div
== 4);
177 /* overflow test with exact division */
178 assert_se(sizeof(0U) == 4);
179 assert_se(0xfffffffaU
% 10U == 0U);
180 assert_se(0xfffffffaU
/ 10U == 429496729U);
181 assert_se(DIV_ROUND_UP(0xfffffffaU
, 10U) == 429496729U);
182 assert_se((0xfffffffaU
+ 10U - 1U) / 10U == 0U);
183 assert_se(0xfffffffaU
/ 10U + !!(0xfffffffaU
% 10U) == 429496729U);
185 /* overflow test with rounded division */
186 assert_se(0xfffffffdU
% 10U == 3U);
187 assert_se(0xfffffffdU
/ 10U == 429496729U);
188 assert_se(DIV_ROUND_UP(0xfffffffdU
, 10U) == 429496730U);
189 assert_se((0xfffffffdU
+ 10U - 1U) / 10U == 0U);
190 assert_se(0xfffffffdU
/ 10U + !!(0xfffffffdU
% 10U) == 429496730U);
193 static void test_first_word(void) {
194 assert_se(first_word("Hello", ""));
195 assert_se(first_word("Hello", "Hello"));
196 assert_se(first_word("Hello world", "Hello"));
197 assert_se(first_word("Hello\tworld", "Hello"));
198 assert_se(first_word("Hello\nworld", "Hello"));
199 assert_se(first_word("Hello\rworld", "Hello"));
200 assert_se(first_word("Hello ", "Hello"));
202 assert_se(!first_word("Hello", "Hellooo"));
203 assert_se(!first_word("Hello", "xxxxx"));
204 assert_se(!first_word("Hellooo", "Hello"));
207 static void test_close_many(void) {
209 char name0
[] = "/tmp/test-close-many.XXXXXX";
210 char name1
[] = "/tmp/test-close-many.XXXXXX";
211 char name2
[] = "/tmp/test-close-many.XXXXXX";
213 fds
[0] = mkostemp_safe(name0
, O_RDWR
|O_CLOEXEC
);
214 fds
[1] = mkostemp_safe(name1
, O_RDWR
|O_CLOEXEC
);
215 fds
[2] = mkostemp_safe(name2
, O_RDWR
|O_CLOEXEC
);
219 assert_se(fcntl(fds
[0], F_GETFD
) == -1);
220 assert_se(fcntl(fds
[1], F_GETFD
) == -1);
221 assert_se(fcntl(fds
[2], F_GETFD
) >= 0);
230 static void test_parse_boolean(void) {
231 assert_se(parse_boolean("1") == 1);
232 assert_se(parse_boolean("y") == 1);
233 assert_se(parse_boolean("Y") == 1);
234 assert_se(parse_boolean("yes") == 1);
235 assert_se(parse_boolean("YES") == 1);
236 assert_se(parse_boolean("true") == 1);
237 assert_se(parse_boolean("TRUE") == 1);
238 assert_se(parse_boolean("on") == 1);
239 assert_se(parse_boolean("ON") == 1);
241 assert_se(parse_boolean("0") == 0);
242 assert_se(parse_boolean("n") == 0);
243 assert_se(parse_boolean("N") == 0);
244 assert_se(parse_boolean("no") == 0);
245 assert_se(parse_boolean("NO") == 0);
246 assert_se(parse_boolean("false") == 0);
247 assert_se(parse_boolean("FALSE") == 0);
248 assert_se(parse_boolean("off") == 0);
249 assert_se(parse_boolean("OFF") == 0);
251 assert_se(parse_boolean("garbage") < 0);
252 assert_se(parse_boolean("") < 0);
253 assert_se(parse_boolean("full") < 0);
256 static void test_parse_pid(void) {
260 r
= parse_pid("100", &pid
);
262 assert_se(pid
== 100);
264 r
= parse_pid("0x7FFFFFFF", &pid
);
266 assert_se(pid
== 2147483647);
268 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
269 r
= parse_pid("0", &pid
);
270 assert_se(r
== -ERANGE
);
271 assert_se(pid
== 65);
273 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
274 r
= parse_pid("-100", &pid
);
275 assert_se(r
== -ERANGE
);
276 assert_se(pid
== 65);
278 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
279 r
= parse_pid("0xFFFFFFFFFFFFFFFFF", &pid
);
280 assert_se(r
== -ERANGE
);
281 assert_se(pid
== 65);
283 r
= parse_pid("junk", &pid
);
284 assert_se(r
== -EINVAL
);
287 static void test_parse_uid(void) {
291 r
= parse_uid("100", &uid
);
293 assert_se(uid
== 100);
295 r
= parse_uid("65535", &uid
);
296 assert_se(r
== -ENXIO
);
298 r
= parse_uid("asdsdas", &uid
);
299 assert_se(r
== -EINVAL
);
302 static void test_safe_atou16(void) {
306 r
= safe_atou16("12345", &l
);
308 assert_se(l
== 12345);
310 r
= safe_atou16("123456", &l
);
311 assert_se(r
== -ERANGE
);
313 r
= safe_atou16("junk", &l
);
314 assert_se(r
== -EINVAL
);
317 static void test_safe_atoi16(void) {
321 r
= safe_atoi16("-12345", &l
);
323 assert_se(l
== -12345);
325 r
= safe_atoi16("36536", &l
);
326 assert_se(r
== -ERANGE
);
328 r
= safe_atoi16("junk", &l
);
329 assert_se(r
== -EINVAL
);
332 static void test_safe_atolli(void) {
336 r
= safe_atolli("12345", &l
);
338 assert_se(l
== 12345);
340 r
= safe_atolli("junk", &l
);
341 assert_se(r
== -EINVAL
);
344 static void test_safe_atod(void) {
349 r
= safe_atod("junk", &d
);
350 assert_se(r
== -EINVAL
);
352 r
= safe_atod("0.2244", &d
);
354 assert_se(fabs(d
- 0.2244) < 0.000001);
356 r
= safe_atod("0,5", &d
);
357 assert_se(r
== -EINVAL
);
361 assert_se(*e
== ',');
363 /* Check if this really is locale independent */
364 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
366 r
= safe_atod("0.2244", &d
);
368 assert_se(fabs(d
- 0.2244) < 0.000001);
370 r
= safe_atod("0,5", &d
);
371 assert_se(r
== -EINVAL
);
374 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
377 /* And check again, reset */
378 assert_se(setlocale(LC_NUMERIC
, "C"));
380 r
= safe_atod("0.2244", &d
);
382 assert_se(fabs(d
- 0.2244) < 0.000001);
384 r
= safe_atod("0,5", &d
);
385 assert_se(r
== -EINVAL
);
389 assert_se(*e
== ',');
392 static void test_strappend(void) {
393 _cleanup_free_
char *t1
, *t2
, *t3
, *t4
;
395 t1
= strappend(NULL
, NULL
);
396 assert_se(streq(t1
, ""));
398 t2
= strappend(NULL
, "suf");
399 assert_se(streq(t2
, "suf"));
401 t3
= strappend("pre", NULL
);
402 assert_se(streq(t3
, "pre"));
404 t4
= strappend("pre", "suf");
405 assert_se(streq(t4
, "presuf"));
408 static void test_strstrip(void) {
410 char input
[] = " hello, waldo. ";
413 assert_se(streq(r
, "hello, waldo."));
416 static void test_delete_chars(void) {
418 char input
[] = " hello, waldo. abc";
420 r
= delete_chars(input
, WHITESPACE
);
421 assert_se(streq(r
, "hello,waldo.abc"));
424 static void test_in_charset(void) {
425 assert_se(in_charset("dddaaabbbcccc", "abcd"));
426 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
429 static void test_hexchar(void) {
430 assert_se(hexchar(0xa) == 'a');
431 assert_se(hexchar(0x0) == '0');
434 static void test_unhexchar(void) {
435 assert_se(unhexchar('a') == 0xA);
436 assert_se(unhexchar('A') == 0xA);
437 assert_se(unhexchar('0') == 0x0);
440 static void test_base32hexchar(void) {
441 assert_se(base32hexchar(0) == '0');
442 assert_se(base32hexchar(9) == '9');
443 assert_se(base32hexchar(10) == 'A');
444 assert_se(base32hexchar(31) == 'V');
447 static void test_unbase32hexchar(void) {
448 assert_se(unbase32hexchar('0') == 0);
449 assert_se(unbase32hexchar('9') == 9);
450 assert_se(unbase32hexchar('A') == 10);
451 assert_se(unbase32hexchar('V') == 31);
452 assert_se(unbase32hexchar('=') == -EINVAL
);
455 static void test_base64char(void) {
456 assert_se(base64char(0) == 'A');
457 assert_se(base64char(26) == 'a');
458 assert_se(base64char(63) == '/');
461 static void test_unbase64char(void) {
462 assert_se(unbase64char('A') == 0);
463 assert_se(unbase64char('Z') == 25);
464 assert_se(unbase64char('a') == 26);
465 assert_se(unbase64char('z') == 51);
466 assert_se(unbase64char('0') == 52);
467 assert_se(unbase64char('9') == 61);
468 assert_se(unbase64char('+') == 62);
469 assert_se(unbase64char('/') == 63);
470 assert_se(unbase64char('=') == -EINVAL
);
473 static void test_octchar(void) {
474 assert_se(octchar(00) == '0');
475 assert_se(octchar(07) == '7');
478 static void test_unoctchar(void) {
479 assert_se(unoctchar('0') == 00);
480 assert_se(unoctchar('7') == 07);
483 static void test_decchar(void) {
484 assert_se(decchar(0) == '0');
485 assert_se(decchar(9) == '9');
488 static void test_undecchar(void) {
489 assert_se(undecchar('0') == 0);
490 assert_se(undecchar('9') == 9);
493 static void test_unhexmem(void) {
494 const char *hex
= "efa214921";
495 const char *hex_invalid
= "efa214921o";
496 _cleanup_free_
char *hex2
= NULL
;
497 _cleanup_free_
void *mem
= NULL
;
500 assert_se(unhexmem(hex
, strlen(hex
), &mem
, &len
) == 0);
501 assert_se(unhexmem(hex
, strlen(hex
) + 1, &mem
, &len
) == -EINVAL
);
502 assert_se(unhexmem(hex_invalid
, strlen(hex_invalid
), &mem
, &len
) == -EINVAL
);
504 assert_se((hex2
= hexmem(mem
, len
)));
508 assert_se(memcmp(hex
, hex2
, strlen(hex
)) == 0);
512 assert_se(unhexmem(hex
, strlen(hex
) - 1, &mem
, &len
) == 0);
513 assert_se((hex2
= hexmem(mem
, len
)));
514 assert_se(memcmp(hex
, hex2
, strlen(hex
) - 1) == 0);
517 /* https://tools.ietf.org/html/rfc4648#section-10 */
518 static void test_base32hexmem(void) {
521 b32
= base32hexmem("", strlen(""), true);
523 assert_se(streq(b32
, ""));
526 b32
= base32hexmem("f", strlen("f"), true);
528 assert_se(streq(b32
, "CO======"));
531 b32
= base32hexmem("fo", strlen("fo"), true);
533 assert_se(streq(b32
, "CPNG===="));
536 b32
= base32hexmem("foo", strlen("foo"), true);
538 assert_se(streq(b32
, "CPNMU==="));
541 b32
= base32hexmem("foob", strlen("foob"), true);
543 assert_se(streq(b32
, "CPNMUOG="));
546 b32
= base32hexmem("fooba", strlen("fooba"), true);
548 assert_se(streq(b32
, "CPNMUOJ1"));
551 b32
= base32hexmem("foobar", strlen("foobar"), true);
553 assert_se(streq(b32
, "CPNMUOJ1E8======"));
556 b32
= base32hexmem("", strlen(""), false);
558 assert_se(streq(b32
, ""));
561 b32
= base32hexmem("f", strlen("f"), false);
563 assert_se(streq(b32
, "CO"));
566 b32
= base32hexmem("fo", strlen("fo"), false);
568 assert_se(streq(b32
, "CPNG"));
571 b32
= base32hexmem("foo", strlen("foo"), false);
573 assert_se(streq(b32
, "CPNMU"));
576 b32
= base32hexmem("foob", strlen("foob"), false);
578 assert_se(streq(b32
, "CPNMUOG"));
581 b32
= base32hexmem("fooba", strlen("fooba"), false);
583 assert_se(streq(b32
, "CPNMUOJ1"));
586 b32
= base32hexmem("foobar", strlen("foobar"), false);
588 assert_se(streq(b32
, "CPNMUOJ1E8"));
592 static void test_unbase32hexmem(void) {
596 assert_se(unbase32hexmem("", strlen(""), true, &mem
, &len
) == 0);
597 assert_se(streq(strndupa(mem
, len
), ""));
600 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem
, &len
) == 0);
601 assert_se(streq(strndupa(mem
, len
), "f"));
604 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem
, &len
) == 0);
605 assert_se(streq(strndupa(mem
, len
), "fo"));
608 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem
, &len
) == 0);
609 assert_se(streq(strndupa(mem
, len
), "foo"));
612 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem
, &len
) == 0);
613 assert_se(streq(strndupa(mem
, len
), "foob"));
616 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == 0);
617 assert_se(streq(strndupa(mem
, len
), "fooba"));
620 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem
, &len
) == 0);
621 assert_se(streq(strndupa(mem
, len
), "foobar"));
624 assert_se(unbase32hexmem("A", strlen("A"), true, &mem
, &len
) == -EINVAL
);
625 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem
, &len
) == -EINVAL
);
626 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem
, &len
) == -EINVAL
);
627 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem
, &len
) == -EINVAL
);
628 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem
, &len
) == -EINVAL
);
629 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem
, &len
) == -EINVAL
);
630 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem
, &len
) == -EINVAL
);
631 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem
, &len
) == -EINVAL
);
633 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
634 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
635 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
636 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
637 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
638 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
639 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
640 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
642 assert_se(unbase32hexmem("", strlen(""), false, &mem
, &len
) == 0);
643 assert_se(streq(strndupa(mem
, len
), ""));
646 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem
, &len
) == 0);
647 assert_se(streq(strndupa(mem
, len
), "f"));
650 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem
, &len
) == 0);
651 assert_se(streq(strndupa(mem
, len
), "fo"));
654 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem
, &len
) == 0);
655 assert_se(streq(strndupa(mem
, len
), "foo"));
658 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem
, &len
) == 0);
659 assert_se(streq(strndupa(mem
, len
), "foob"));
662 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem
, &len
) == 0);
663 assert_se(streq(strndupa(mem
, len
), "fooba"));
666 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem
, &len
) == 0);
667 assert_se(streq(strndupa(mem
, len
), "foobar"));
670 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem
, &len
) == -EINVAL
);
671 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem
, &len
) == -EINVAL
);
672 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
673 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
674 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem
, &len
) == -EINVAL
);
675 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem
, &len
) == -EINVAL
);
676 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem
, &len
) == -EINVAL
);
677 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem
, &len
) == -EINVAL
);
678 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem
, &len
) == -EINVAL
);
679 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem
, &len
) == -EINVAL
);
682 /* https://tools.ietf.org/html/rfc4648#section-10 */
683 static void test_base64mem(void) {
686 b64
= base64mem("", strlen(""));
688 assert_se(streq(b64
, ""));
691 b64
= base64mem("f", strlen("f"));
693 assert_se(streq(b64
, "Zg=="));
696 b64
= base64mem("fo", strlen("fo"));
698 assert_se(streq(b64
, "Zm8="));
701 b64
= base64mem("foo", strlen("foo"));
703 assert_se(streq(b64
, "Zm9v"));
706 b64
= base64mem("foob", strlen("foob"));
708 assert_se(streq(b64
, "Zm9vYg=="));
711 b64
= base64mem("fooba", strlen("fooba"));
713 assert_se(streq(b64
, "Zm9vYmE="));
716 b64
= base64mem("foobar", strlen("foobar"));
718 assert_se(streq(b64
, "Zm9vYmFy"));
722 static void test_unbase64mem(void) {
726 assert_se(unbase64mem("", strlen(""), &mem
, &len
) == 0);
727 assert_se(streq(strndupa(mem
, len
), ""));
730 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem
, &len
) == 0);
731 assert_se(streq(strndupa(mem
, len
), "f"));
734 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem
, &len
) == 0);
735 assert_se(streq(strndupa(mem
, len
), "fo"));
738 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem
, &len
) == 0);
739 assert_se(streq(strndupa(mem
, len
), "foo"));
742 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem
, &len
) == 0);
743 assert_se(streq(strndupa(mem
, len
), "foob"));
746 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem
, &len
) == 0);
747 assert_se(streq(strndupa(mem
, len
), "fooba"));
750 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem
, &len
) == 0);
751 assert_se(streq(strndupa(mem
, len
), "foobar"));
754 assert_se(unbase64mem("A", strlen("A"), &mem
, &len
) == -EINVAL
);
755 assert_se(unbase64mem("A====", strlen("A===="), &mem
, &len
) == -EINVAL
);
756 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem
, &len
) == -EINVAL
);
757 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem
, &len
) == -EINVAL
);
760 static void test_cescape(void) {
761 _cleanup_free_
char *escaped
;
763 assert_se(escaped
= cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
764 assert_se(streq(escaped
, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
767 static void test_cunescape(void) {
768 _cleanup_free_
char *unescaped
;
770 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped
) < 0);
771 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX
, &unescaped
) >= 0);
772 assert_se(streq_ptr(unescaped
, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
773 unescaped
= mfree(unescaped
);
775 /* incomplete sequences */
776 assert_se(cunescape("\\x0", 0, &unescaped
) < 0);
777 assert_se(cunescape("\\x0", UNESCAPE_RELAX
, &unescaped
) >= 0);
778 assert_se(streq_ptr(unescaped
, "\\x0"));
779 unescaped
= mfree(unescaped
);
781 assert_se(cunescape("\\x", 0, &unescaped
) < 0);
782 assert_se(cunescape("\\x", UNESCAPE_RELAX
, &unescaped
) >= 0);
783 assert_se(streq_ptr(unescaped
, "\\x"));
784 unescaped
= mfree(unescaped
);
786 assert_se(cunescape("\\", 0, &unescaped
) < 0);
787 assert_se(cunescape("\\", UNESCAPE_RELAX
, &unescaped
) >= 0);
788 assert_se(streq_ptr(unescaped
, "\\"));
789 unescaped
= mfree(unescaped
);
791 assert_se(cunescape("\\11", 0, &unescaped
) < 0);
792 assert_se(cunescape("\\11", UNESCAPE_RELAX
, &unescaped
) >= 0);
793 assert_se(streq_ptr(unescaped
, "\\11"));
794 unescaped
= mfree(unescaped
);
796 assert_se(cunescape("\\1", 0, &unescaped
) < 0);
797 assert_se(cunescape("\\1", UNESCAPE_RELAX
, &unescaped
) >= 0);
798 assert_se(streq_ptr(unescaped
, "\\1"));
799 unescaped
= mfree(unescaped
);
801 assert_se(cunescape("\\u0000", 0, &unescaped
) < 0);
802 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX
, &unescaped
) >= 0);
803 assert_se(streq_ptr(unescaped
, "ßßΠA"));
804 unescaped
= mfree(unescaped
);
806 assert_se(cunescape("\\073", 0, &unescaped
) >= 0);
807 assert_se(streq_ptr(unescaped
, ";"));
810 static void test_foreach_word(void) {
811 const char *word
, *state
;
814 const char test
[] = "test abc d\te f ";
815 const char * const expected
[] = {
825 FOREACH_WORD(word
, l
, test
, state
)
826 assert_se(strneq(expected
[i
++], word
, l
));
829 static void check(const char *test
, char** expected
, bool trailing
) {
830 const char *word
, *state
;
834 printf("<<<%s>>>\n", test
);
835 FOREACH_WORD_QUOTED(word
, l
, test
, state
) {
836 _cleanup_free_
char *t
= NULL
;
838 assert_se(t
= strndup(word
, l
));
839 assert_se(strneq(expected
[i
++], word
, l
));
842 printf("<<<%s>>>\n", state
);
843 assert_se(expected
[i
] == NULL
);
844 assert_se(isempty(state
) == !trailing
);
847 static void test_foreach_word_quoted(void) {
848 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
872 static void test_memdup_multiply(void) {
873 int org
[] = {1, 2, 3};
876 dup
= (int*)memdup_multiply(org
, sizeof(int), 3);
879 assert_se(dup
[0] == 1);
880 assert_se(dup
[1] == 2);
881 assert_se(dup
[2] == 3);
885 static void test_u64log2(void) {
886 assert_se(u64log2(0) == 0);
887 assert_se(u64log2(8) == 3);
888 assert_se(u64log2(9) == 3);
889 assert_se(u64log2(15) == 3);
890 assert_se(u64log2(16) == 4);
891 assert_se(u64log2(1024*1024) == 20);
892 assert_se(u64log2(1024*1024+5) == 20);
895 static void test_protect_errno(void) {
901 assert_se(errno
== 12);
904 static void test_parse_size(void) {
907 assert_se(parse_size("111", 1024, &bytes
) == 0);
908 assert_se(bytes
== 111);
910 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
911 assert_se(bytes
== 111);
913 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
914 assert_se(bytes
== 112);
916 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
917 assert_se(bytes
== 112);
919 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
920 assert_se(bytes
== 3*1024 + 512);
922 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
923 assert_se(bytes
== 3*1024);
925 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
926 assert_se(bytes
== 3*1024);
928 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
930 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
931 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
933 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
935 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
936 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
938 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
939 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
941 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
943 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
944 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
946 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
947 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
949 assert_se(parse_size("12P", 1024, &bytes
) == 0);
950 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
952 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
954 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
955 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
957 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
959 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
961 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
963 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
964 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
965 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
967 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
969 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
972 static void test_parse_cpu_set(void) {
977 /* Simple range (from CPUAffinity example) */
978 ncpus
= parse_cpu_set_and_warn("1 2", &c
, NULL
, "fake", 1, "CPUAffinity");
979 assert_se(ncpus
>= 1024);
980 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus
), c
));
981 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus
), c
));
982 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 2);
985 /* A more interesting range */
986 ncpus
= parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c
, NULL
, "fake", 1, "CPUAffinity");
987 assert_se(ncpus
>= 1024);
988 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 8);
989 for (cpu
= 0; cpu
< 4; cpu
++)
990 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
991 for (cpu
= 8; cpu
< 12; cpu
++)
992 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
996 ncpus
= parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c
, NULL
, "fake", 1, "CPUAffinity");
997 assert_se(ncpus
>= 1024);
998 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 4);
999 for (cpu
= 8; cpu
< 12; cpu
++)
1000 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1003 /* Use commas as separators */
1004 ncpus
= parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c
, NULL
, "fake", 1, "CPUAffinity");
1005 assert_se(ncpus
< 0);
1009 ncpus
= parse_cpu_set_and_warn("0-3,8-11", &c
, NULL
, "fake", 1, "CPUAffinity");
1010 assert_se(ncpus
< 0);
1014 ncpus
= parse_cpu_set_and_warn("0 1 2 3 garbage", &c
, NULL
, "fake", 1, "CPUAffinity");
1015 assert_se(ncpus
< 0);
1020 ncpus
= parse_cpu_set_and_warn("", &c
, NULL
, "fake", 1, "CPUAffinity");
1021 assert_se(ncpus
== 0); /* empty string returns 0 */
1024 /* Runnaway quoted string */
1025 ncpus
= parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c
, NULL
, "fake", 1, "CPUAffinity");
1026 assert_se(ncpus
< 0);
1030 static void test_config_parse_iec_uint64(void) {
1031 uint64_t offset
= 0;
1032 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset
, NULL
) == 0);
1033 assert_se(offset
== 4 * 1024 * 1024);
1035 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset
, NULL
) == 0);
1038 static void test_strextend(void) {
1039 _cleanup_free_
char *str
= strdup("0123");
1040 strextend(&str
, "456", "78", "9", NULL
);
1041 assert_se(streq(str
, "0123456789"));
1044 static void test_strrep(void) {
1045 _cleanup_free_
char *one
, *three
, *zero
;
1046 one
= strrep("waldo", 1);
1047 three
= strrep("waldo", 3);
1048 zero
= strrep("waldo", 0);
1050 assert_se(streq(one
, "waldo"));
1051 assert_se(streq(three
, "waldowaldowaldo"));
1052 assert_se(streq(zero
, ""));
1055 static void test_split_pair(void) {
1056 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
1058 assert_se(split_pair("", "", &a
, &b
) == -EINVAL
);
1059 assert_se(split_pair("foo=bar", "", &a
, &b
) == -EINVAL
);
1060 assert_se(split_pair("", "=", &a
, &b
) == -EINVAL
);
1061 assert_se(split_pair("foo=bar", "=", &a
, &b
) >= 0);
1062 assert_se(streq(a
, "foo"));
1063 assert_se(streq(b
, "bar"));
1066 assert_se(split_pair("==", "==", &a
, &b
) >= 0);
1067 assert_se(streq(a
, ""));
1068 assert_se(streq(b
, ""));
1072 assert_se(split_pair("===", "==", &a
, &b
) >= 0);
1073 assert_se(streq(a
, ""));
1074 assert_se(streq(b
, "="));
1077 static void test_fstab_node_to_udev_node(void) {
1080 n
= fstab_node_to_udev_node("LABEL=applé/jack");
1082 assert_se(streq(n
, "/dev/disk/by-label/applé\\x2fjack"));
1085 n
= fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1087 assert_se(streq(n
, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1090 n
= fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1092 assert_se(streq(n
, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1095 n
= fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1097 assert_se(streq(n
, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1100 n
= fstab_node_to_udev_node("PONIES=awesome");
1102 assert_se(streq(n
, "PONIES=awesome"));
1105 n
= fstab_node_to_udev_node("/dev/xda1");
1107 assert_se(streq(n
, "/dev/xda1"));
1111 static void test_get_files_in_directory(void) {
1112 _cleanup_strv_free_
char **l
= NULL
, **t
= NULL
;
1114 assert_se(get_files_in_directory("/tmp", &l
) >= 0);
1115 assert_se(get_files_in_directory(".", &t
) >= 0);
1116 assert_se(get_files_in_directory(".", NULL
) >= 0);
1119 static void test_in_set(void) {
1120 assert_se(IN_SET(1, 1));
1121 assert_se(IN_SET(1, 1, 2, 3, 4));
1122 assert_se(IN_SET(2, 1, 2, 3, 4));
1123 assert_se(IN_SET(3, 1, 2, 3, 4));
1124 assert_se(IN_SET(4, 1, 2, 3, 4));
1125 assert_se(!IN_SET(0, 1));
1126 assert_se(!IN_SET(0, 1, 2, 3, 4));
1129 static void test_writing_tmpfile(void) {
1130 char name
[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1131 _cleanup_free_
char *contents
= NULL
;
1134 struct iovec iov
[3];
1136 IOVEC_SET_STRING(iov
[0], "abc\n");
1137 IOVEC_SET_STRING(iov
[1], ALPHANUMERICAL
"\n");
1138 IOVEC_SET_STRING(iov
[2], "");
1140 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1141 printf("tmpfile: %s", name
);
1143 r
= writev(fd
, iov
, 3);
1146 r
= read_full_file(name
, &contents
, &size
);
1148 printf("contents: %s", contents
);
1149 assert_se(streq(contents
, "abc\n" ALPHANUMERICAL
"\n"));
1154 static void test_hexdump(void) {
1158 hexdump(stdout
, NULL
, 0);
1159 hexdump(stdout
, "", 0);
1160 hexdump(stdout
, "", 1);
1161 hexdump(stdout
, "x", 1);
1162 hexdump(stdout
, "x", 2);
1163 hexdump(stdout
, "foobar", 7);
1164 hexdump(stdout
, "f\nobar", 7);
1165 hexdump(stdout
, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1167 for (i
= 0; i
< ELEMENTSOF(data
); i
++)
1170 hexdump(stdout
, data
, sizeof(data
));
1173 static void test_log2i(void) {
1174 assert_se(log2i(1) == 0);
1175 assert_se(log2i(2) == 1);
1176 assert_se(log2i(3) == 1);
1177 assert_se(log2i(4) == 2);
1178 assert_se(log2i(32) == 5);
1179 assert_se(log2i(33) == 5);
1180 assert_se(log2i(63) == 5);
1181 assert_se(log2i(INT_MAX
) == sizeof(int)*8-2);
1184 static void test_foreach_string(void) {
1185 const char * const t
[] = {
1194 FOREACH_STRING(x
, "foo", "bar", "waldo")
1195 assert_se(streq_ptr(t
[i
++], x
));
1199 FOREACH_STRING(x
, "zzz")
1200 assert_se(streq(x
, "zzz"));
1203 static void test_filename_is_valid(void) {
1204 char foo
[FILENAME_MAX
+2];
1207 assert_se(!filename_is_valid(""));
1208 assert_se(!filename_is_valid("/bar/foo"));
1209 assert_se(!filename_is_valid("/"));
1210 assert_se(!filename_is_valid("."));
1211 assert_se(!filename_is_valid(".."));
1213 for (i
=0; i
<FILENAME_MAX
+1; i
++)
1215 foo
[FILENAME_MAX
+1] = '\0';
1217 assert_se(!filename_is_valid(foo
));
1219 assert_se(filename_is_valid("foo_bar-333"));
1220 assert_se(filename_is_valid("o.o"));
1223 static void test_string_has_cc(void) {
1224 assert_se(string_has_cc("abc\1", NULL
));
1225 assert_se(string_has_cc("abc\x7f", NULL
));
1226 assert_se(string_has_cc("abc\x7f", NULL
));
1227 assert_se(string_has_cc("abc\t\x7f", "\t"));
1228 assert_se(string_has_cc("abc\t\x7f", "\t"));
1229 assert_se(string_has_cc("\x7f", "\t"));
1230 assert_se(string_has_cc("\x7f", "\t\a"));
1232 assert_se(!string_has_cc("abc\t\t", "\t"));
1233 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1234 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1237 static void test_ascii_strlower(void) {
1238 char a
[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1239 assert_se(streq(ascii_strlower(a
), "aabbcc jk ii od lkjjj kkd lk"));
1242 static void test_files_same(void) {
1243 _cleanup_close_
int fd
= -1;
1244 char name
[] = "/tmp/test-files_same.XXXXXX";
1245 char name_alias
[] = "/tmp/test-files_same.alias";
1247 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1249 assert_se(symlink(name
, name_alias
) >= 0);
1251 assert_se(files_same(name
, name
));
1252 assert_se(files_same(name
, name_alias
));
1258 static void test_is_valid_documentation_url(void) {
1259 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1260 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1261 assert_se(documentation_url_is_valid("file:/foo/foo"));
1262 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1263 assert_se(documentation_url_is_valid("info:bar"));
1265 assert_se(!documentation_url_is_valid("foo:"));
1266 assert_se(!documentation_url_is_valid("info:"));
1267 assert_se(!documentation_url_is_valid(""));
1270 static void test_file_in_same_dir(void) {
1273 t
= file_in_same_dir("/", "a");
1274 assert_se(streq(t
, "/a"));
1277 t
= file_in_same_dir("/", "/a");
1278 assert_se(streq(t
, "/a"));
1281 t
= file_in_same_dir("", "a");
1282 assert_se(streq(t
, "a"));
1285 t
= file_in_same_dir("a/", "a");
1286 assert_se(streq(t
, "a/a"));
1289 t
= file_in_same_dir("bar/foo", "bar");
1290 assert_se(streq(t
, "bar/bar"));
1294 static void test_endswith(void) {
1295 assert_se(endswith("foobar", "bar"));
1296 assert_se(endswith("foobar", ""));
1297 assert_se(endswith("foobar", "foobar"));
1298 assert_se(endswith("", ""));
1300 assert_se(!endswith("foobar", "foo"));
1301 assert_se(!endswith("foobar", "foobarfoofoo"));
1304 static void test_endswith_no_case(void) {
1305 assert_se(endswith_no_case("fooBAR", "bar"));
1306 assert_se(endswith_no_case("foobar", ""));
1307 assert_se(endswith_no_case("foobar", "FOOBAR"));
1308 assert_se(endswith_no_case("", ""));
1310 assert_se(!endswith_no_case("foobar", "FOO"));
1311 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1314 static void test_close_nointr(void) {
1315 char name
[] = "/tmp/test-test-close_nointr.XXXXXX";
1318 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1320 assert_se(close_nointr(fd
) >= 0);
1321 assert_se(close_nointr(fd
) < 0);
1327 static void test_unlink_noerrno(void) {
1328 char name
[] = "/tmp/test-close_nointr.XXXXXX";
1331 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1333 assert_se(close_nointr(fd
) >= 0);
1338 assert_se(unlink_noerrno(name
) >= 0);
1339 assert_se(errno
== -42);
1340 assert_se(unlink_noerrno(name
) < 0);
1341 assert_se(errno
== -42);
1345 static void test_readlink_and_make_absolute(void) {
1346 char tempdir
[] = "/tmp/test-readlink_and_make_absolute";
1347 char name
[] = "/tmp/test-readlink_and_make_absolute/original";
1348 char name2
[] = "test-readlink_and_make_absolute/original";
1349 char name_alias
[] = "/tmp/test-readlink_and_make_absolute-alias";
1352 assert_se(mkdir_safe(tempdir
, 0755, getuid(), getgid()) >= 0);
1353 assert_se(touch(name
) >= 0);
1355 assert_se(symlink(name
, name_alias
) >= 0);
1356 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1357 assert_se(streq(r
, name
));
1359 assert_se(unlink(name_alias
) >= 0);
1361 assert_se(chdir(tempdir
) >= 0);
1362 assert_se(symlink(name2
, name_alias
) >= 0);
1363 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1364 assert_se(streq(r
, name
));
1366 assert_se(unlink(name_alias
) >= 0);
1368 assert_se(rm_rf(tempdir
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
1371 static void test_ignore_signals(void) {
1372 assert_se(ignore_signals(SIGINT
, -1) >= 0);
1373 assert_se(kill(getpid(), SIGINT
) >= 0);
1374 assert_se(ignore_signals(SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1375 assert_se(kill(getpid(), SIGUSR1
) >= 0);
1376 assert_se(kill(getpid(), SIGUSR2
) >= 0);
1377 assert_se(kill(getpid(), SIGTERM
) >= 0);
1378 assert_se(kill(getpid(), SIGPIPE
) >= 0);
1379 assert_se(default_signals(SIGINT
, SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1382 static void test_strshorten(void) {
1383 char s
[] = "foobar";
1385 assert_se(strlen(strshorten(s
, 6)) == 6);
1386 assert_se(strlen(strshorten(s
, 12)) == 6);
1387 assert_se(strlen(strshorten(s
, 2)) == 2);
1388 assert_se(strlen(strshorten(s
, 0)) == 0);
1391 static void test_strjoina(void) {
1394 actual
= strjoina("", "foo", "bar");
1395 assert_se(streq(actual
, "foobar"));
1397 actual
= strjoina("foo", "bar", "baz");
1398 assert_se(streq(actual
, "foobarbaz"));
1400 actual
= strjoina("foo", "", "bar", "baz");
1401 assert_se(streq(actual
, "foobarbaz"));
1403 actual
= strjoina("foo");
1404 assert_se(streq(actual
, "foo"));
1406 actual
= strjoina(NULL
);
1407 assert_se(streq(actual
, ""));
1409 actual
= strjoina(NULL
, "foo");
1410 assert_se(streq(actual
, ""));
1412 actual
= strjoina("foo", NULL
, "bar");
1413 assert_se(streq(actual
, "foo"));
1416 static void test_is_symlink(void) {
1417 char name
[] = "/tmp/test-is_symlink.XXXXXX";
1418 char name_link
[] = "/tmp/test-is_symlink.link";
1419 _cleanup_close_
int fd
= -1;
1421 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1423 assert_se(symlink(name
, name_link
) >= 0);
1425 assert_se(is_symlink(name
) == 0);
1426 assert_se(is_symlink(name_link
) == 1);
1427 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1434 static void test_search_and_fopen(void) {
1435 const char *dirs
[] = {"/tmp/foo/bar", "/tmp", NULL
};
1436 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1441 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1445 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1449 r
= search_and_fopen(name
, "r", NULL
, dirs
, &f
);
1453 r
= search_and_fopen(basename(name
), "r", "/", dirs
, &f
);
1457 r
= search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1459 r
= search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1465 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1470 static void test_search_and_fopen_nulstr(void) {
1471 const char dirs
[] = "/tmp/foo/bar\0/tmp\0";
1472 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1477 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1481 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1485 r
= search_and_fopen_nulstr(name
, "r", NULL
, dirs
, &f
);
1489 r
= search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1491 r
= search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1497 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1501 static void test_glob_exists(void) {
1502 char name
[] = "/tmp/test-glob_exists.XXXXXX";
1506 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1510 r
= glob_exists("/tmp/test-glob_exists*");
1515 r
= glob_exists("/tmp/test-glob_exists*");
1519 static void test_execute_directory(void) {
1520 char template_lo
[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1521 char template_hi
[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1522 const char * dirs
[] = {template_hi
, template_lo
, NULL
};
1523 const char *name
, *name2
, *name3
, *overridden
, *override
, *masked
, *mask
;
1525 assert_se(mkdtemp(template_lo
));
1526 assert_se(mkdtemp(template_hi
));
1528 name
= strjoina(template_lo
, "/script");
1529 name2
= strjoina(template_hi
, "/script2");
1530 name3
= strjoina(template_lo
, "/useless");
1531 overridden
= strjoina(template_lo
, "/overridden");
1532 override
= strjoina(template_hi
, "/overridden");
1533 masked
= strjoina(template_lo
, "/masked");
1534 mask
= strjoina(template_hi
, "/masked");
1536 assert_se(write_string_file(name
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE
) == 0);
1537 assert_se(write_string_file(name2
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE
) == 0);
1538 assert_se(write_string_file(overridden
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1539 assert_se(write_string_file(override
, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE
) == 0);
1540 assert_se(write_string_file(masked
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1541 assert_se(symlink("/dev/null", mask
) == 0);
1542 assert_se(chmod(name
, 0755) == 0);
1543 assert_se(chmod(name2
, 0755) == 0);
1544 assert_se(chmod(overridden
, 0755) == 0);
1545 assert_se(chmod(override
, 0755) == 0);
1546 assert_se(chmod(masked
, 0755) == 0);
1547 assert_se(touch(name3
) >= 0);
1549 execute_directories(dirs
, DEFAULT_TIMEOUT_USEC
, NULL
);
1551 assert_se(chdir(template_lo
) == 0);
1552 assert_se(access("it_works", F_OK
) >= 0);
1553 assert_se(access("failed", F_OK
) < 0);
1555 assert_se(chdir(template_hi
) == 0);
1556 assert_se(access("it_works2", F_OK
) >= 0);
1557 assert_se(access("failed", F_OK
) < 0);
1559 (void) rm_rf(template_lo
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1560 (void) rm_rf(template_hi
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1563 static void test_extract_first_word(void) {
1564 const char *p
, *original
;
1567 p
= original
= "foobar waldo";
1568 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1569 assert_se(streq(t
, "foobar"));
1571 assert_se(p
== original
+ 7);
1573 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1574 assert_se(streq(t
, "waldo"));
1576 assert_se(isempty(p
));
1578 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1580 assert_se(isempty(p
));
1582 p
= original
= "\"foobar\" \'waldo\'";
1583 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1584 assert_se(streq(t
, "\"foobar\""));
1586 assert_se(p
== original
+ 9);
1588 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1589 assert_se(streq(t
, "\'waldo\'"));
1591 assert_se(isempty(p
));
1593 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1595 assert_se(isempty(p
));
1597 p
= original
= "\"foobar\" \'waldo\'";
1598 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1599 assert_se(streq(t
, "foobar"));
1601 assert_se(p
== original
+ 9);
1603 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1604 assert_se(streq(t
, "waldo"));
1606 assert_se(isempty(p
));
1608 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1610 assert_se(isempty(p
));
1612 p
= original
= "\"";
1613 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1614 assert_se(streq(t
, "\""));
1616 assert_se(isempty(p
));
1618 p
= original
= "\"";
1619 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1620 assert_se(p
== original
+ 1);
1622 p
= original
= "\'";
1623 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1624 assert_se(streq(t
, "\'"));
1626 assert_se(isempty(p
));
1628 p
= original
= "\'";
1629 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1630 assert_se(p
== original
+ 1);
1632 p
= original
= "\'fooo";
1633 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1634 assert_se(streq(t
, "\'fooo"));
1636 assert_se(isempty(p
));
1638 p
= original
= "\'fooo";
1639 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1640 assert_se(p
== original
+ 5);
1642 p
= original
= "\'fooo";
1643 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1644 assert_se(streq(t
, "fooo"));
1646 assert_se(isempty(p
));
1648 p
= original
= "\"fooo";
1649 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1650 assert_se(streq(t
, "fooo"));
1652 assert_se(isempty(p
));
1654 p
= original
= "yay\'foo\'bar";
1655 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1656 assert_se(streq(t
, "yay\'foo\'bar"));
1658 assert_se(isempty(p
));
1660 p
= original
= "yay\'foo\'bar";
1661 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1662 assert_se(streq(t
, "yayfoobar"));
1664 assert_se(isempty(p
));
1666 p
= original
= " foobar ";
1667 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1668 assert_se(streq(t
, "foobar"));
1670 assert_se(isempty(p
));
1672 p
= original
= " foo\\ba\\x6ar ";
1673 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1674 assert_se(streq(t
, "foo\ba\x6ar"));
1676 assert_se(isempty(p
));
1678 p
= original
= " foo\\ba\\x6ar ";
1679 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1680 assert_se(streq(t
, "foobax6ar"));
1682 assert_se(isempty(p
));
1684 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1685 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1686 assert_se(streq(t
, "föo"));
1688 assert_se(p
== original
+ 13);
1690 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
) > 0);
1691 assert_se(streq(t
, "pi\360\237\222\251le"));
1693 assert_se(isempty(p
));
1695 p
= original
= "fooo\\";
1696 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1697 assert_se(streq(t
, "fooo"));
1699 assert_se(isempty(p
));
1701 p
= original
= "fooo\\";
1702 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1703 assert_se(streq(t
, "fooo\\"));
1705 assert_se(isempty(p
));
1707 p
= original
= "fooo\\";
1708 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1709 assert_se(streq(t
, "fooo\\"));
1711 assert_se(isempty(p
));
1713 p
= original
= "fooo\\";
1714 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1715 assert_se(streq(t
, "fooo\\"));
1717 assert_se(isempty(p
));
1719 p
= original
= "\"foo\\";
1720 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == -EINVAL
);
1721 assert_se(p
== original
+ 5);
1723 p
= original
= "\"foo\\";
1724 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1725 assert_se(streq(t
, "foo"));
1727 assert_se(isempty(p
));
1729 p
= original
= "foo::bar";
1730 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1731 assert_se(streq(t
, "foo"));
1733 assert_se(p
== original
+ 5);
1735 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1736 assert_se(streq(t
, "bar"));
1738 assert_se(isempty(p
));
1740 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1742 assert_se(isempty(p
));
1744 p
= original
= "foo\\:bar::waldo";
1745 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1746 assert_se(streq(t
, "foo:bar"));
1748 assert_se(p
== original
+ 10);
1750 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1751 assert_se(streq(t
, "waldo"));
1753 assert_se(isempty(p
));
1755 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1757 assert_se(isempty(p
));
1759 p
= original
= "\"foo\\";
1760 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
) == -EINVAL
);
1761 assert_se(p
== original
+ 5);
1763 p
= original
= "\"foo\\";
1764 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1765 assert_se(streq(t
, "foo\\"));
1767 assert_se(isempty(p
));
1769 p
= original
= "\"foo\\";
1770 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1771 assert_se(streq(t
, "foo\\"));
1773 assert_se(isempty(p
));
1775 p
= original
= "fooo\\ bar quux";
1776 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1777 assert_se(streq(t
, "fooo bar"));
1779 assert_se(p
== original
+ 10);
1781 p
= original
= "fooo\\ bar quux";
1782 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1783 assert_se(streq(t
, "fooo bar"));
1785 assert_se(p
== original
+ 10);
1787 p
= original
= "fooo\\ bar quux";
1788 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1789 assert_se(streq(t
, "fooo bar"));
1791 assert_se(p
== original
+ 10);
1793 p
= original
= "fooo\\ bar quux";
1794 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1795 assert_se(p
== original
+ 5);
1797 p
= original
= "fooo\\ bar quux";
1798 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1799 assert_se(streq(t
, "fooo\\ bar"));
1801 assert_se(p
== original
+ 10);
1803 p
= original
= "\\w+@\\K[\\d.]+";
1804 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1805 assert_se(p
== original
+ 1);
1807 p
= original
= "\\w+@\\K[\\d.]+";
1808 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1809 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1811 assert_se(isempty(p
));
1813 p
= original
= "\\w+\\b";
1814 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1815 assert_se(streq(t
, "\\w+\b"));
1817 assert_se(isempty(p
));
1819 p
= original
= "-N ''";
1820 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1821 assert_se(streq(t
, "-N"));
1823 assert_se(p
== original
+ 3);
1825 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1826 assert_se(streq(t
, ""));
1828 assert_se(isempty(p
));
1830 p
= original
= ":foo\\:bar::waldo:";
1831 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1833 assert_se(streq(t
, ""));
1835 assert_se(p
== original
+ 1);
1837 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1838 assert_se(streq(t
, "foo:bar"));
1840 assert_se(p
== original
+ 10);
1842 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1844 assert_se(streq(t
, ""));
1846 assert_se(p
== original
+ 11);
1848 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1849 assert_se(streq(t
, "waldo"));
1851 assert_se(p
== original
+ 17);
1853 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1854 assert_se(streq(t
, ""));
1856 assert_se(p
== NULL
);
1858 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 0);
1863 static void test_extract_first_word_and_warn(void) {
1864 const char *p
, *original
;
1867 p
= original
= "foobar waldo";
1868 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1869 assert_se(streq(t
, "foobar"));
1871 assert_se(p
== original
+ 7);
1873 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1874 assert_se(streq(t
, "waldo"));
1876 assert_se(isempty(p
));
1878 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1880 assert_se(isempty(p
));
1882 p
= original
= "\"foobar\" \'waldo\'";
1883 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1884 assert_se(streq(t
, "foobar"));
1886 assert_se(p
== original
+ 9);
1888 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1889 assert_se(streq(t
, "waldo"));
1891 assert_se(isempty(p
));
1893 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1895 assert_se(isempty(p
));
1897 p
= original
= "\"";
1898 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1899 assert_se(p
== original
+ 1);
1901 p
= original
= "\'";
1902 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1903 assert_se(p
== original
+ 1);
1905 p
= original
= "\'fooo";
1906 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1907 assert_se(p
== original
+ 5);
1909 p
= original
= "\'fooo";
1910 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1911 assert_se(streq(t
, "fooo"));
1913 assert_se(isempty(p
));
1915 p
= original
= " foo\\ba\\x6ar ";
1916 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1917 assert_se(streq(t
, "foo\ba\x6ar"));
1919 assert_se(isempty(p
));
1921 p
= original
= " foo\\ba\\x6ar ";
1922 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1923 assert_se(streq(t
, "foobax6ar"));
1925 assert_se(isempty(p
));
1927 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1928 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1929 assert_se(streq(t
, "föo"));
1931 assert_se(p
== original
+ 13);
1933 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1934 assert_se(streq(t
, "pi\360\237\222\251le"));
1936 assert_se(isempty(p
));
1938 p
= original
= "fooo\\";
1939 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1940 assert_se(streq(t
, "fooo"));
1942 assert_se(isempty(p
));
1944 p
= original
= "fooo\\";
1945 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1946 assert_se(streq(t
, "fooo\\"));
1948 assert_se(isempty(p
));
1950 p
= original
= "fooo\\";
1951 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1952 assert_se(streq(t
, "fooo\\"));
1954 assert_se(isempty(p
));
1956 p
= original
= "\"foo\\";
1957 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1958 assert_se(p
== original
+ 5);
1960 p
= original
= "\"foo\\";
1961 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1962 assert_se(streq(t
, "foo"));
1964 assert_se(isempty(p
));
1966 p
= original
= "\"foo\\";
1967 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) == -EINVAL
);
1968 assert_se(p
== original
+ 5);
1970 p
= original
= "\"foo\\";
1971 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1972 assert_se(streq(t
, "foo"));
1974 assert_se(isempty(p
));
1976 p
= original
= "fooo\\ bar quux";
1977 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1978 assert_se(streq(t
, "fooo bar"));
1980 assert_se(p
== original
+ 10);
1982 p
= original
= "fooo\\ bar quux";
1983 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1984 assert_se(streq(t
, "fooo bar"));
1986 assert_se(p
== original
+ 10);
1988 p
= original
= "fooo\\ bar quux";
1989 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1990 assert_se(streq(t
, "fooo\\ bar"));
1992 assert_se(p
== original
+ 10);
1994 p
= original
= "\\w+@\\K[\\d.]+";
1995 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1996 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1998 assert_se(isempty(p
));
2000 p
= original
= "\\w+\\b";
2001 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
2002 assert_se(streq(t
, "\\w+\b"));
2004 assert_se(isempty(p
));
2007 static void test_extract_many_words(void) {
2008 const char *p
, *original
;
2011 p
= original
= "foobar waldi piep";
2012 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 3);
2013 assert_se(isempty(p
));
2014 assert_se(streq_ptr(a
, "foobar"));
2015 assert_se(streq_ptr(b
, "waldi"));
2016 assert_se(streq_ptr(c
, "piep"));
2021 p
= original
= "'foobar' wa\"ld\"i ";
2022 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 2);
2023 assert_se(isempty(p
));
2024 assert_se(streq_ptr(a
, "'foobar'"));
2025 assert_se(streq_ptr(b
, "wa\"ld\"i"));
2026 assert_se(streq_ptr(c
, NULL
));
2030 p
= original
= "'foobar' wa\"ld\"i ";
2031 assert_se(extract_many_words(&p
, NULL
, EXTRACT_QUOTES
, &a
, &b
, &c
, NULL
) == 2);
2032 assert_se(isempty(p
));
2033 assert_se(streq_ptr(a
, "foobar"));
2034 assert_se(streq_ptr(b
, "waldi"));
2035 assert_se(streq_ptr(c
, NULL
));
2040 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2041 assert_se(isempty(p
));
2042 assert_se(streq_ptr(a
, NULL
));
2043 assert_se(streq_ptr(b
, NULL
));
2044 assert_se(streq_ptr(c
, NULL
));
2047 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2048 assert_se(isempty(p
));
2049 assert_se(streq_ptr(a
, NULL
));
2050 assert_se(streq_ptr(b
, NULL
));
2051 assert_se(streq_ptr(c
, NULL
));
2053 p
= original
= "foobar";
2054 assert_se(extract_many_words(&p
, NULL
, 0, NULL
) == 0);
2055 assert_se(p
== original
);
2057 p
= original
= "foobar waldi";
2058 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2059 assert_se(p
== original
+7);
2060 assert_se(streq_ptr(a
, "foobar"));
2063 p
= original
= " foobar ";
2064 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2065 assert_se(isempty(p
));
2066 assert_se(streq_ptr(a
, "foobar"));
2070 static int parse_item(const char *key
, const char *value
) {
2073 log_info("kernel cmdline option <%s> = <%s>", key
, strna(value
));
2077 static void test_parse_proc_cmdline(void) {
2078 assert_se(parse_proc_cmdline(parse_item
) >= 0);
2081 static void test_raw_clone(void) {
2082 pid_t parent
, pid
, pid2
;
2085 log_info("before clone: getpid()→"PID_FMT
, parent
);
2086 assert_se(raw_getpid() == parent
);
2088 pid
= raw_clone(0, NULL
);
2089 assert_se(pid
>= 0);
2091 pid2
= raw_getpid();
2092 log_info("raw_clone: "PID_FMT
" getpid()→"PID_FMT
" raw_getpid()→"PID_FMT
,
2093 pid
, getpid(), pid2
);
2095 assert_se(pid2
!= parent
);
2096 _exit(EXIT_SUCCESS
);
2100 assert_se(pid2
== parent
);
2101 waitpid(pid
, &status
, __WCLONE
);
2102 assert_se(WIFEXITED(status
) && WEXITSTATUS(status
) == EXIT_SUCCESS
);
2106 static void test_same_fd(void) {
2107 _cleanup_close_pair_
int p
[2] = { -1, -1 };
2108 _cleanup_close_
int a
= -1, b
= -1, c
= -1;
2110 assert_se(pipe2(p
, O_CLOEXEC
) >= 0);
2111 assert_se((a
= dup(p
[0])) >= 0);
2112 assert_se((b
= open("/dev/null", O_RDONLY
|O_CLOEXEC
)) >= 0);
2113 assert_se((c
= dup(a
)) >= 0);
2115 assert_se(same_fd(p
[0], p
[0]) > 0);
2116 assert_se(same_fd(p
[1], p
[1]) > 0);
2117 assert_se(same_fd(a
, a
) > 0);
2118 assert_se(same_fd(b
, b
) > 0);
2120 assert_se(same_fd(a
, p
[0]) > 0);
2121 assert_se(same_fd(p
[0], a
) > 0);
2122 assert_se(same_fd(c
, p
[0]) > 0);
2123 assert_se(same_fd(p
[0], c
) > 0);
2124 assert_se(same_fd(a
, c
) > 0);
2125 assert_se(same_fd(c
, a
) > 0);
2127 assert_se(same_fd(p
[0], p
[1]) == 0);
2128 assert_se(same_fd(p
[1], p
[0]) == 0);
2129 assert_se(same_fd(p
[0], b
) == 0);
2130 assert_se(same_fd(b
, p
[0]) == 0);
2131 assert_se(same_fd(p
[1], a
) == 0);
2132 assert_se(same_fd(a
, p
[1]) == 0);
2133 assert_se(same_fd(p
[1], b
) == 0);
2134 assert_se(same_fd(b
, p
[1]) == 0);
2136 assert_se(same_fd(a
, b
) == 0);
2137 assert_se(same_fd(b
, a
) == 0);
2140 static void test_uid_ptr(void) {
2142 assert_se(UID_TO_PTR(0) != NULL
);
2143 assert_se(UID_TO_PTR(1000) != NULL
);
2145 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2146 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2149 static void test_sparse_write_one(int fd
, const char *buffer
, size_t n
) {
2152 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2153 assert_se(ftruncate(fd
, 0) >= 0);
2154 assert_se(sparse_write(fd
, buffer
, n
, 4) == (ssize_t
) n
);
2156 assert_se(lseek(fd
, 0, SEEK_CUR
) == (off_t
) n
);
2157 assert_se(ftruncate(fd
, n
) >= 0);
2159 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2160 assert_se(read(fd
, check
, n
) == (ssize_t
) n
);
2162 assert_se(memcmp(buffer
, check
, n
) == 0);
2165 static void test_sparse_write(void) {
2166 const char test_a
[] = "test";
2167 const char test_b
[] = "\0\0\0\0test\0\0\0\0";
2168 const char test_c
[] = "\0\0test\0\0\0\0";
2169 const char test_d
[] = "\0\0test\0\0\0test\0\0\0\0test\0\0\0\0\0test\0\0\0test\0\0\0\0test\0\0\0\0\0\0\0\0";
2170 const char test_e
[] = "test\0\0\0\0test";
2171 _cleanup_close_
int fd
= -1;
2172 char fn
[] = "/tmp/sparseXXXXXX";
2174 fd
= mkostemp(fn
, O_CLOEXEC
);
2178 test_sparse_write_one(fd
, test_a
, sizeof(test_a
));
2179 test_sparse_write_one(fd
, test_b
, sizeof(test_b
));
2180 test_sparse_write_one(fd
, test_c
, sizeof(test_c
));
2181 test_sparse_write_one(fd
, test_d
, sizeof(test_d
));
2182 test_sparse_write_one(fd
, test_e
, sizeof(test_e
));
2185 static void test_shell_escape_one(const char *s
, const char *bad
, const char *expected
) {
2186 _cleanup_free_
char *r
;
2188 assert_se(r
= shell_escape(s
, bad
));
2189 assert_se(streq_ptr(r
, expected
));
2192 static void test_shell_escape(void) {
2193 test_shell_escape_one("", "", "");
2194 test_shell_escape_one("\\", "", "\\\\");
2195 test_shell_escape_one("foobar", "", "foobar");
2196 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2197 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2200 static void test_shell_maybe_quote_one(const char *s
, const char *expected
) {
2201 _cleanup_free_
char *r
;
2203 assert_se(r
= shell_maybe_quote(s
));
2204 assert_se(streq(r
, expected
));
2207 static void test_shell_maybe_quote(void) {
2209 test_shell_maybe_quote_one("", "");
2210 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2211 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2212 test_shell_maybe_quote_one("foobar", "foobar");
2213 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2214 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2215 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2218 static void test_parse_mode(void) {
2221 assert_se(parse_mode("-1", &m
) < 0);
2222 assert_se(parse_mode("", &m
) < 0);
2223 assert_se(parse_mode("888", &m
) < 0);
2224 assert_se(parse_mode("77777", &m
) < 0);
2226 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
2227 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
2228 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
2229 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
2232 static void test_tempfn(void) {
2233 char *ret
= NULL
, *p
;
2235 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL
, &ret
) >= 0);
2236 assert_se(streq_ptr(ret
, "/foo/bar/.#waldoXXXXXX"));
2239 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret
) >= 0);
2240 assert_se(streq_ptr(ret
, "/foo/bar/.#[miau]waldoXXXXXX"));
2243 assert_se(tempfn_random("/foo/bar/waldo", NULL
, &ret
) >= 0);
2244 assert_se(p
= startswith(ret
, "/foo/bar/.#waldo"));
2245 assert_se(strlen(p
) == 16);
2246 assert_se(in_charset(p
, "0123456789abcdef"));
2249 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret
) >= 0);
2250 assert_se(p
= startswith(ret
, "/foo/bar/.#[wuff]waldo"));
2251 assert_se(strlen(p
) == 16);
2252 assert_se(in_charset(p
, "0123456789abcdef"));
2255 assert_se(tempfn_random_child("/foo/bar/waldo", NULL
, &ret
) >= 0);
2256 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#"));
2257 assert_se(strlen(p
) == 16);
2258 assert_se(in_charset(p
, "0123456789abcdef"));
2261 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret
) >= 0);
2262 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#[kikiriki]"));
2263 assert_se(strlen(p
) == 16);
2264 assert_se(in_charset(p
, "0123456789abcdef"));
2268 static void test_strcmp_ptr(void) {
2269 assert_se(strcmp_ptr(NULL
, NULL
) == 0);
2270 assert_se(strcmp_ptr("", NULL
) > 0);
2271 assert_se(strcmp_ptr("foo", NULL
) > 0);
2272 assert_se(strcmp_ptr(NULL
, "") < 0);
2273 assert_se(strcmp_ptr(NULL
, "bar") < 0);
2274 assert_se(strcmp_ptr("foo", "bar") > 0);
2275 assert_se(strcmp_ptr("bar", "baz") < 0);
2276 assert_se(strcmp_ptr("foo", "foo") == 0);
2277 assert_se(strcmp_ptr("", "") == 0);
2280 static void test_fgetxattrat_fake(void) {
2281 char t
[] = "/var/tmp/xattrtestXXXXXX";
2282 _cleanup_close_
int fd
= -1;
2287 assert_se(mkdtemp(t
));
2288 x
= strjoina(t
, "/test");
2289 assert_se(touch(x
) >= 0);
2291 r
= setxattr(x
, "user.foo", "bar", 3, 0);
2292 if (r
< 0 && errno
== EOPNOTSUPP
) /* no xattrs supported on /var/tmp... */
2296 fd
= open(t
, O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2299 assert_se(fgetxattrat_fake(fd
, "test", "user.foo", v
, 3, 0) >= 0);
2300 assert_se(memcmp(v
, "bar", 3) == 0);
2303 fd
= open("/", O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2305 assert_se(fgetxattrat_fake(fd
, "usr", "user.idontexist", v
, 3, 0) == -ENODATA
);
2308 assert_se(unlink(x
) >= 0);
2309 assert_se(rmdir(t
) >= 0);
2312 int main(int argc
, char *argv
[]) {
2313 log_parse_environment();
2317 test_align_power2();
2319 test_container_of();
2321 test_div_round_up();
2324 test_parse_boolean();
2333 test_delete_chars();
2337 test_base32hexchar();
2338 test_unbase32hexchar();
2340 test_unbase64char();
2346 test_base32hexmem();
2347 test_unbase32hexmem();
2352 test_foreach_word();
2353 test_foreach_word_quoted();
2354 test_memdup_multiply();
2356 test_protect_errno();
2358 test_parse_cpu_set();
2359 test_config_parse_iec_uint64();
2363 test_fstab_node_to_udev_node();
2364 test_get_files_in_directory();
2366 test_writing_tmpfile();
2369 test_foreach_string();
2370 test_filename_is_valid();
2371 test_string_has_cc();
2372 test_ascii_strlower();
2374 test_is_valid_documentation_url();
2375 test_file_in_same_dir();
2377 test_endswith_no_case();
2378 test_close_nointr();
2379 test_unlink_noerrno();
2380 test_readlink_and_make_absolute();
2381 test_ignore_signals();
2385 test_search_and_fopen();
2386 test_search_and_fopen_nulstr();
2388 test_execute_directory();
2389 test_extract_first_word();
2390 test_extract_first_word_and_warn();
2391 test_extract_many_words();
2392 test_parse_proc_cmdline();
2396 test_sparse_write();
2397 test_shell_escape();
2398 test_shell_maybe_quote();
2402 test_fgetxattrat_fake();