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 "hexdecoct.h"
43 #include "parse-util.h"
44 #include "process-util.h"
46 #include "signal-util.h"
47 #include "string-util.h"
49 #include "user-util.h"
53 static void test_streq_ptr(void) {
54 assert_se(streq_ptr(NULL
, NULL
));
55 assert_se(!streq_ptr("abc", "cdef"));
58 static void test_align_power2(void) {
61 assert_se(ALIGN_POWER2(0) == 0);
62 assert_se(ALIGN_POWER2(1) == 1);
63 assert_se(ALIGN_POWER2(2) == 2);
64 assert_se(ALIGN_POWER2(3) == 4);
65 assert_se(ALIGN_POWER2(12) == 16);
67 assert_se(ALIGN_POWER2(ULONG_MAX
) == 0);
68 assert_se(ALIGN_POWER2(ULONG_MAX
- 1) == 0);
69 assert_se(ALIGN_POWER2(ULONG_MAX
- 1024) == 0);
70 assert_se(ALIGN_POWER2(ULONG_MAX
/ 2) == ULONG_MAX
/ 2 + 1);
71 assert_se(ALIGN_POWER2(ULONG_MAX
+ 1) == 0);
73 for (i
= 1; i
< 131071; ++i
) {
74 for (p2
= 1; p2
< i
; p2
<<= 1)
77 assert_se(ALIGN_POWER2(i
) == p2
);
80 for (i
= ULONG_MAX
- 1024; i
< ULONG_MAX
; ++i
) {
81 for (p2
= 1; p2
&& p2
< i
; p2
<<= 1)
84 assert_se(ALIGN_POWER2(i
) == p2
);
88 static void test_max(void) {
91 int b
[CONST_MAX(10, 100)];
93 .a
= CONST_MAX(10, 100),
97 assert_cc(sizeof(val1
.b
) == sizeof(int) * 100);
99 /* CONST_MAX returns (void) instead of a value if the passed arguments
100 * are not of the same type or not constant expressions. */
101 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
102 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
104 assert_se(val1
.a
== 100);
105 assert_se(MAX(++d
, 0) == 1);
108 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
109 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
110 assert_cc(MAXSIZE(char, long) == sizeof(long));
112 assert_se(MAX(-5, 5) == 5);
113 assert_se(MAX(5, 5) == 5);
114 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
115 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
116 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
117 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
118 assert_se(LESS_BY(8, 4) == 4);
119 assert_se(LESS_BY(8, 8) == 0);
120 assert_se(LESS_BY(4, 8) == 0);
121 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
122 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
123 assert_se(CLAMP(-5, 0, 1) == 0);
124 assert_se(CLAMP(5, 0, 1) == 1);
125 assert_se(CLAMP(5, -10, 1) == 1);
126 assert_se(CLAMP(5, -10, 10) == 5);
127 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
130 static void test_container_of(void) {
136 } _packed_ myval
= { };
138 assert_cc(sizeof(myval
) == 17);
139 assert_se(container_of(&myval
.v1
, struct mytype
, v1
) == &myval
);
140 assert_se(container_of(&myval
.v2
, struct mytype
, v2
) == &myval
);
141 assert_se(container_of(&container_of(&myval
.v2
,
148 static void test_alloca(void) {
149 static const uint8_t zero
[997] = { };
152 t
= alloca_align(17, 512);
153 assert_se(!((uintptr_t)t
& 0xff));
156 t
= alloca0_align(997, 1024);
157 assert_se(!((uintptr_t)t
& 0x1ff));
158 assert_se(!memcmp(t
, zero
, 997));
161 static void test_div_round_up(void) {
165 assert_se(DIV_ROUND_UP(0, 8) == 0);
166 assert_se(DIV_ROUND_UP(1, 8) == 1);
167 assert_se(DIV_ROUND_UP(8, 8) == 1);
168 assert_se(DIV_ROUND_UP(12, 8) == 2);
169 assert_se(DIV_ROUND_UP(16, 8) == 2);
171 /* test multiple evaluation */
173 assert_se(DIV_ROUND_UP(div
++, 8) == 0 && div
== 1);
174 assert_se(DIV_ROUND_UP(++div
, 8) == 1 && div
== 2);
175 assert_se(DIV_ROUND_UP(8, div
++) == 4 && div
== 3);
176 assert_se(DIV_ROUND_UP(8, ++div
) == 2 && div
== 4);
178 /* overflow test with exact division */
179 assert_se(sizeof(0U) == 4);
180 assert_se(0xfffffffaU
% 10U == 0U);
181 assert_se(0xfffffffaU
/ 10U == 429496729U);
182 assert_se(DIV_ROUND_UP(0xfffffffaU
, 10U) == 429496729U);
183 assert_se((0xfffffffaU
+ 10U - 1U) / 10U == 0U);
184 assert_se(0xfffffffaU
/ 10U + !!(0xfffffffaU
% 10U) == 429496729U);
186 /* overflow test with rounded division */
187 assert_se(0xfffffffdU
% 10U == 3U);
188 assert_se(0xfffffffdU
/ 10U == 429496729U);
189 assert_se(DIV_ROUND_UP(0xfffffffdU
, 10U) == 429496730U);
190 assert_se((0xfffffffdU
+ 10U - 1U) / 10U == 0U);
191 assert_se(0xfffffffdU
/ 10U + !!(0xfffffffdU
% 10U) == 429496730U);
194 static void test_first_word(void) {
195 assert_se(first_word("Hello", ""));
196 assert_se(first_word("Hello", "Hello"));
197 assert_se(first_word("Hello world", "Hello"));
198 assert_se(first_word("Hello\tworld", "Hello"));
199 assert_se(first_word("Hello\nworld", "Hello"));
200 assert_se(first_word("Hello\rworld", "Hello"));
201 assert_se(first_word("Hello ", "Hello"));
203 assert_se(!first_word("Hello", "Hellooo"));
204 assert_se(!first_word("Hello", "xxxxx"));
205 assert_se(!first_word("Hellooo", "Hello"));
208 static void test_close_many(void) {
210 char name0
[] = "/tmp/test-close-many.XXXXXX";
211 char name1
[] = "/tmp/test-close-many.XXXXXX";
212 char name2
[] = "/tmp/test-close-many.XXXXXX";
214 fds
[0] = mkostemp_safe(name0
, O_RDWR
|O_CLOEXEC
);
215 fds
[1] = mkostemp_safe(name1
, O_RDWR
|O_CLOEXEC
);
216 fds
[2] = mkostemp_safe(name2
, O_RDWR
|O_CLOEXEC
);
220 assert_se(fcntl(fds
[0], F_GETFD
) == -1);
221 assert_se(fcntl(fds
[1], F_GETFD
) == -1);
222 assert_se(fcntl(fds
[2], F_GETFD
) >= 0);
231 static void test_parse_boolean(void) {
232 assert_se(parse_boolean("1") == 1);
233 assert_se(parse_boolean("y") == 1);
234 assert_se(parse_boolean("Y") == 1);
235 assert_se(parse_boolean("yes") == 1);
236 assert_se(parse_boolean("YES") == 1);
237 assert_se(parse_boolean("true") == 1);
238 assert_se(parse_boolean("TRUE") == 1);
239 assert_se(parse_boolean("on") == 1);
240 assert_se(parse_boolean("ON") == 1);
242 assert_se(parse_boolean("0") == 0);
243 assert_se(parse_boolean("n") == 0);
244 assert_se(parse_boolean("N") == 0);
245 assert_se(parse_boolean("no") == 0);
246 assert_se(parse_boolean("NO") == 0);
247 assert_se(parse_boolean("false") == 0);
248 assert_se(parse_boolean("FALSE") == 0);
249 assert_se(parse_boolean("off") == 0);
250 assert_se(parse_boolean("OFF") == 0);
252 assert_se(parse_boolean("garbage") < 0);
253 assert_se(parse_boolean("") < 0);
254 assert_se(parse_boolean("full") < 0);
257 static void test_parse_pid(void) {
261 r
= parse_pid("100", &pid
);
263 assert_se(pid
== 100);
265 r
= parse_pid("0x7FFFFFFF", &pid
);
267 assert_se(pid
== 2147483647);
269 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
270 r
= parse_pid("0", &pid
);
271 assert_se(r
== -ERANGE
);
272 assert_se(pid
== 65);
274 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
275 r
= parse_pid("-100", &pid
);
276 assert_se(r
== -ERANGE
);
277 assert_se(pid
== 65);
279 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
280 r
= parse_pid("0xFFFFFFFFFFFFFFFFF", &pid
);
281 assert_se(r
== -ERANGE
);
282 assert_se(pid
== 65);
284 r
= parse_pid("junk", &pid
);
285 assert_se(r
== -EINVAL
);
288 static void test_parse_uid(void) {
292 r
= parse_uid("100", &uid
);
294 assert_se(uid
== 100);
296 r
= parse_uid("65535", &uid
);
297 assert_se(r
== -ENXIO
);
299 r
= parse_uid("asdsdas", &uid
);
300 assert_se(r
== -EINVAL
);
303 static void test_safe_atou16(void) {
307 r
= safe_atou16("12345", &l
);
309 assert_se(l
== 12345);
311 r
= safe_atou16("123456", &l
);
312 assert_se(r
== -ERANGE
);
314 r
= safe_atou16("junk", &l
);
315 assert_se(r
== -EINVAL
);
318 static void test_safe_atoi16(void) {
322 r
= safe_atoi16("-12345", &l
);
324 assert_se(l
== -12345);
326 r
= safe_atoi16("36536", &l
);
327 assert_se(r
== -ERANGE
);
329 r
= safe_atoi16("junk", &l
);
330 assert_se(r
== -EINVAL
);
333 static void test_safe_atolli(void) {
337 r
= safe_atolli("12345", &l
);
339 assert_se(l
== 12345);
341 r
= safe_atolli("junk", &l
);
342 assert_se(r
== -EINVAL
);
345 static void test_safe_atod(void) {
350 r
= safe_atod("junk", &d
);
351 assert_se(r
== -EINVAL
);
353 r
= safe_atod("0.2244", &d
);
355 assert_se(fabs(d
- 0.2244) < 0.000001);
357 r
= safe_atod("0,5", &d
);
358 assert_se(r
== -EINVAL
);
362 assert_se(*e
== ',');
364 /* Check if this really is locale independent */
365 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
367 r
= safe_atod("0.2244", &d
);
369 assert_se(fabs(d
- 0.2244) < 0.000001);
371 r
= safe_atod("0,5", &d
);
372 assert_se(r
== -EINVAL
);
375 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
378 /* And check again, reset */
379 assert_se(setlocale(LC_NUMERIC
, "C"));
381 r
= safe_atod("0.2244", &d
);
383 assert_se(fabs(d
- 0.2244) < 0.000001);
385 r
= safe_atod("0,5", &d
);
386 assert_se(r
== -EINVAL
);
390 assert_se(*e
== ',');
393 static void test_strappend(void) {
394 _cleanup_free_
char *t1
, *t2
, *t3
, *t4
;
396 t1
= strappend(NULL
, NULL
);
397 assert_se(streq(t1
, ""));
399 t2
= strappend(NULL
, "suf");
400 assert_se(streq(t2
, "suf"));
402 t3
= strappend("pre", NULL
);
403 assert_se(streq(t3
, "pre"));
405 t4
= strappend("pre", "suf");
406 assert_se(streq(t4
, "presuf"));
409 static void test_strstrip(void) {
411 char input
[] = " hello, waldo. ";
414 assert_se(streq(r
, "hello, waldo."));
417 static void test_delete_chars(void) {
419 char input
[] = " hello, waldo. abc";
421 r
= delete_chars(input
, WHITESPACE
);
422 assert_se(streq(r
, "hello,waldo.abc"));
425 static void test_in_charset(void) {
426 assert_se(in_charset("dddaaabbbcccc", "abcd"));
427 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
430 static void test_hexchar(void) {
431 assert_se(hexchar(0xa) == 'a');
432 assert_se(hexchar(0x0) == '0');
435 static void test_unhexchar(void) {
436 assert_se(unhexchar('a') == 0xA);
437 assert_se(unhexchar('A') == 0xA);
438 assert_se(unhexchar('0') == 0x0);
441 static void test_base32hexchar(void) {
442 assert_se(base32hexchar(0) == '0');
443 assert_se(base32hexchar(9) == '9');
444 assert_se(base32hexchar(10) == 'A');
445 assert_se(base32hexchar(31) == 'V');
448 static void test_unbase32hexchar(void) {
449 assert_se(unbase32hexchar('0') == 0);
450 assert_se(unbase32hexchar('9') == 9);
451 assert_se(unbase32hexchar('A') == 10);
452 assert_se(unbase32hexchar('V') == 31);
453 assert_se(unbase32hexchar('=') == -EINVAL
);
456 static void test_base64char(void) {
457 assert_se(base64char(0) == 'A');
458 assert_se(base64char(26) == 'a');
459 assert_se(base64char(63) == '/');
462 static void test_unbase64char(void) {
463 assert_se(unbase64char('A') == 0);
464 assert_se(unbase64char('Z') == 25);
465 assert_se(unbase64char('a') == 26);
466 assert_se(unbase64char('z') == 51);
467 assert_se(unbase64char('0') == 52);
468 assert_se(unbase64char('9') == 61);
469 assert_se(unbase64char('+') == 62);
470 assert_se(unbase64char('/') == 63);
471 assert_se(unbase64char('=') == -EINVAL
);
474 static void test_octchar(void) {
475 assert_se(octchar(00) == '0');
476 assert_se(octchar(07) == '7');
479 static void test_unoctchar(void) {
480 assert_se(unoctchar('0') == 00);
481 assert_se(unoctchar('7') == 07);
484 static void test_decchar(void) {
485 assert_se(decchar(0) == '0');
486 assert_se(decchar(9) == '9');
489 static void test_undecchar(void) {
490 assert_se(undecchar('0') == 0);
491 assert_se(undecchar('9') == 9);
494 static void test_unhexmem(void) {
495 const char *hex
= "efa214921";
496 const char *hex_invalid
= "efa214921o";
497 _cleanup_free_
char *hex2
= NULL
;
498 _cleanup_free_
void *mem
= NULL
;
501 assert_se(unhexmem(hex
, strlen(hex
), &mem
, &len
) == 0);
502 assert_se(unhexmem(hex
, strlen(hex
) + 1, &mem
, &len
) == -EINVAL
);
503 assert_se(unhexmem(hex_invalid
, strlen(hex_invalid
), &mem
, &len
) == -EINVAL
);
505 assert_se((hex2
= hexmem(mem
, len
)));
509 assert_se(memcmp(hex
, hex2
, strlen(hex
)) == 0);
513 assert_se(unhexmem(hex
, strlen(hex
) - 1, &mem
, &len
) == 0);
514 assert_se((hex2
= hexmem(mem
, len
)));
515 assert_se(memcmp(hex
, hex2
, strlen(hex
) - 1) == 0);
518 /* https://tools.ietf.org/html/rfc4648#section-10 */
519 static void test_base32hexmem(void) {
522 b32
= base32hexmem("", strlen(""), true);
524 assert_se(streq(b32
, ""));
527 b32
= base32hexmem("f", strlen("f"), true);
529 assert_se(streq(b32
, "CO======"));
532 b32
= base32hexmem("fo", strlen("fo"), true);
534 assert_se(streq(b32
, "CPNG===="));
537 b32
= base32hexmem("foo", strlen("foo"), true);
539 assert_se(streq(b32
, "CPNMU==="));
542 b32
= base32hexmem("foob", strlen("foob"), true);
544 assert_se(streq(b32
, "CPNMUOG="));
547 b32
= base32hexmem("fooba", strlen("fooba"), true);
549 assert_se(streq(b32
, "CPNMUOJ1"));
552 b32
= base32hexmem("foobar", strlen("foobar"), true);
554 assert_se(streq(b32
, "CPNMUOJ1E8======"));
557 b32
= base32hexmem("", strlen(""), false);
559 assert_se(streq(b32
, ""));
562 b32
= base32hexmem("f", strlen("f"), false);
564 assert_se(streq(b32
, "CO"));
567 b32
= base32hexmem("fo", strlen("fo"), false);
569 assert_se(streq(b32
, "CPNG"));
572 b32
= base32hexmem("foo", strlen("foo"), false);
574 assert_se(streq(b32
, "CPNMU"));
577 b32
= base32hexmem("foob", strlen("foob"), false);
579 assert_se(streq(b32
, "CPNMUOG"));
582 b32
= base32hexmem("fooba", strlen("fooba"), false);
584 assert_se(streq(b32
, "CPNMUOJ1"));
587 b32
= base32hexmem("foobar", strlen("foobar"), false);
589 assert_se(streq(b32
, "CPNMUOJ1E8"));
593 static void test_unbase32hexmem(void) {
597 assert_se(unbase32hexmem("", strlen(""), true, &mem
, &len
) == 0);
598 assert_se(streq(strndupa(mem
, len
), ""));
601 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem
, &len
) == 0);
602 assert_se(streq(strndupa(mem
, len
), "f"));
605 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem
, &len
) == 0);
606 assert_se(streq(strndupa(mem
, len
), "fo"));
609 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem
, &len
) == 0);
610 assert_se(streq(strndupa(mem
, len
), "foo"));
613 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem
, &len
) == 0);
614 assert_se(streq(strndupa(mem
, len
), "foob"));
617 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == 0);
618 assert_se(streq(strndupa(mem
, len
), "fooba"));
621 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem
, &len
) == 0);
622 assert_se(streq(strndupa(mem
, len
), "foobar"));
625 assert_se(unbase32hexmem("A", strlen("A"), true, &mem
, &len
) == -EINVAL
);
626 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem
, &len
) == -EINVAL
);
627 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem
, &len
) == -EINVAL
);
628 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem
, &len
) == -EINVAL
);
629 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem
, &len
) == -EINVAL
);
630 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem
, &len
) == -EINVAL
);
631 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem
, &len
) == -EINVAL
);
632 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem
, &len
) == -EINVAL
);
634 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
635 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
636 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
637 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
638 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
639 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
640 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
641 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
643 assert_se(unbase32hexmem("", strlen(""), false, &mem
, &len
) == 0);
644 assert_se(streq(strndupa(mem
, len
), ""));
647 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem
, &len
) == 0);
648 assert_se(streq(strndupa(mem
, len
), "f"));
651 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem
, &len
) == 0);
652 assert_se(streq(strndupa(mem
, len
), "fo"));
655 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem
, &len
) == 0);
656 assert_se(streq(strndupa(mem
, len
), "foo"));
659 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem
, &len
) == 0);
660 assert_se(streq(strndupa(mem
, len
), "foob"));
663 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem
, &len
) == 0);
664 assert_se(streq(strndupa(mem
, len
), "fooba"));
667 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem
, &len
) == 0);
668 assert_se(streq(strndupa(mem
, len
), "foobar"));
671 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem
, &len
) == -EINVAL
);
672 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem
, &len
) == -EINVAL
);
673 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
674 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
675 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem
, &len
) == -EINVAL
);
676 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem
, &len
) == -EINVAL
);
677 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem
, &len
) == -EINVAL
);
678 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem
, &len
) == -EINVAL
);
679 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem
, &len
) == -EINVAL
);
680 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem
, &len
) == -EINVAL
);
683 /* https://tools.ietf.org/html/rfc4648#section-10 */
684 static void test_base64mem(void) {
687 b64
= base64mem("", strlen(""));
689 assert_se(streq(b64
, ""));
692 b64
= base64mem("f", strlen("f"));
694 assert_se(streq(b64
, "Zg=="));
697 b64
= base64mem("fo", strlen("fo"));
699 assert_se(streq(b64
, "Zm8="));
702 b64
= base64mem("foo", strlen("foo"));
704 assert_se(streq(b64
, "Zm9v"));
707 b64
= base64mem("foob", strlen("foob"));
709 assert_se(streq(b64
, "Zm9vYg=="));
712 b64
= base64mem("fooba", strlen("fooba"));
714 assert_se(streq(b64
, "Zm9vYmE="));
717 b64
= base64mem("foobar", strlen("foobar"));
719 assert_se(streq(b64
, "Zm9vYmFy"));
723 static void test_unbase64mem(void) {
727 assert_se(unbase64mem("", strlen(""), &mem
, &len
) == 0);
728 assert_se(streq(strndupa(mem
, len
), ""));
731 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem
, &len
) == 0);
732 assert_se(streq(strndupa(mem
, len
), "f"));
735 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem
, &len
) == 0);
736 assert_se(streq(strndupa(mem
, len
), "fo"));
739 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem
, &len
) == 0);
740 assert_se(streq(strndupa(mem
, len
), "foo"));
743 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem
, &len
) == 0);
744 assert_se(streq(strndupa(mem
, len
), "foob"));
747 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem
, &len
) == 0);
748 assert_se(streq(strndupa(mem
, len
), "fooba"));
751 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem
, &len
) == 0);
752 assert_se(streq(strndupa(mem
, len
), "foobar"));
755 assert_se(unbase64mem("A", strlen("A"), &mem
, &len
) == -EINVAL
);
756 assert_se(unbase64mem("A====", strlen("A===="), &mem
, &len
) == -EINVAL
);
757 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem
, &len
) == -EINVAL
);
758 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem
, &len
) == -EINVAL
);
761 static void test_cescape(void) {
762 _cleanup_free_
char *escaped
;
764 assert_se(escaped
= cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
765 assert_se(streq(escaped
, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
768 static void test_cunescape(void) {
769 _cleanup_free_
char *unescaped
;
771 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped
) < 0);
772 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX
, &unescaped
) >= 0);
773 assert_se(streq_ptr(unescaped
, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
774 unescaped
= mfree(unescaped
);
776 /* incomplete sequences */
777 assert_se(cunescape("\\x0", 0, &unescaped
) < 0);
778 assert_se(cunescape("\\x0", UNESCAPE_RELAX
, &unescaped
) >= 0);
779 assert_se(streq_ptr(unescaped
, "\\x0"));
780 unescaped
= mfree(unescaped
);
782 assert_se(cunescape("\\x", 0, &unescaped
) < 0);
783 assert_se(cunescape("\\x", UNESCAPE_RELAX
, &unescaped
) >= 0);
784 assert_se(streq_ptr(unescaped
, "\\x"));
785 unescaped
= mfree(unescaped
);
787 assert_se(cunescape("\\", 0, &unescaped
) < 0);
788 assert_se(cunescape("\\", UNESCAPE_RELAX
, &unescaped
) >= 0);
789 assert_se(streq_ptr(unescaped
, "\\"));
790 unescaped
= mfree(unescaped
);
792 assert_se(cunescape("\\11", 0, &unescaped
) < 0);
793 assert_se(cunescape("\\11", UNESCAPE_RELAX
, &unescaped
) >= 0);
794 assert_se(streq_ptr(unescaped
, "\\11"));
795 unescaped
= mfree(unescaped
);
797 assert_se(cunescape("\\1", 0, &unescaped
) < 0);
798 assert_se(cunescape("\\1", UNESCAPE_RELAX
, &unescaped
) >= 0);
799 assert_se(streq_ptr(unescaped
, "\\1"));
800 unescaped
= mfree(unescaped
);
802 assert_se(cunescape("\\u0000", 0, &unescaped
) < 0);
803 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX
, &unescaped
) >= 0);
804 assert_se(streq_ptr(unescaped
, "ßßΠA"));
805 unescaped
= mfree(unescaped
);
807 assert_se(cunescape("\\073", 0, &unescaped
) >= 0);
808 assert_se(streq_ptr(unescaped
, ";"));
811 static void test_foreach_word(void) {
812 const char *word
, *state
;
815 const char test
[] = "test abc d\te f ";
816 const char * const expected
[] = {
826 FOREACH_WORD(word
, l
, test
, state
)
827 assert_se(strneq(expected
[i
++], word
, l
));
830 static void check(const char *test
, char** expected
, bool trailing
) {
831 const char *word
, *state
;
835 printf("<<<%s>>>\n", test
);
836 FOREACH_WORD_QUOTED(word
, l
, test
, state
) {
837 _cleanup_free_
char *t
= NULL
;
839 assert_se(t
= strndup(word
, l
));
840 assert_se(strneq(expected
[i
++], word
, l
));
843 printf("<<<%s>>>\n", state
);
844 assert_se(expected
[i
] == NULL
);
845 assert_se(isempty(state
) == !trailing
);
848 static void test_foreach_word_quoted(void) {
849 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
873 static void test_memdup_multiply(void) {
874 int org
[] = {1, 2, 3};
877 dup
= (int*)memdup_multiply(org
, sizeof(int), 3);
880 assert_se(dup
[0] == 1);
881 assert_se(dup
[1] == 2);
882 assert_se(dup
[2] == 3);
886 static void test_u64log2(void) {
887 assert_se(u64log2(0) == 0);
888 assert_se(u64log2(8) == 3);
889 assert_se(u64log2(9) == 3);
890 assert_se(u64log2(15) == 3);
891 assert_se(u64log2(16) == 4);
892 assert_se(u64log2(1024*1024) == 20);
893 assert_se(u64log2(1024*1024+5) == 20);
896 static void test_protect_errno(void) {
902 assert_se(errno
== 12);
905 static void test_parse_size(void) {
908 assert_se(parse_size("111", 1024, &bytes
) == 0);
909 assert_se(bytes
== 111);
911 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
912 assert_se(bytes
== 111);
914 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
915 assert_se(bytes
== 112);
917 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
918 assert_se(bytes
== 112);
920 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
921 assert_se(bytes
== 3*1024 + 512);
923 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
924 assert_se(bytes
== 3*1024);
926 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
927 assert_se(bytes
== 3*1024);
929 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
931 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
932 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
934 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
936 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
937 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
939 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
940 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
942 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
944 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
945 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
947 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
948 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
950 assert_se(parse_size("12P", 1024, &bytes
) == 0);
951 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
953 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
955 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
956 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
958 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
960 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
962 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
964 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
965 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
966 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
968 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
970 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
973 static void test_parse_cpu_set(void) {
978 /* Simple range (from CPUAffinity example) */
979 ncpus
= parse_cpu_set_and_warn("1 2", &c
, NULL
, "fake", 1, "CPUAffinity");
980 assert_se(ncpus
>= 1024);
981 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus
), c
));
982 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus
), c
));
983 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 2);
986 /* A more interesting range */
987 ncpus
= parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c
, NULL
, "fake", 1, "CPUAffinity");
988 assert_se(ncpus
>= 1024);
989 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 8);
990 for (cpu
= 0; cpu
< 4; cpu
++)
991 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
992 for (cpu
= 8; cpu
< 12; cpu
++)
993 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
997 ncpus
= parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c
, NULL
, "fake", 1, "CPUAffinity");
998 assert_se(ncpus
>= 1024);
999 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 4);
1000 for (cpu
= 8; cpu
< 12; cpu
++)
1001 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1004 /* Use commas as separators */
1005 ncpus
= parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c
, NULL
, "fake", 1, "CPUAffinity");
1006 assert_se(ncpus
< 0);
1010 ncpus
= parse_cpu_set_and_warn("0-3,8-11", &c
, NULL
, "fake", 1, "CPUAffinity");
1011 assert_se(ncpus
< 0);
1015 ncpus
= parse_cpu_set_and_warn("0 1 2 3 garbage", &c
, NULL
, "fake", 1, "CPUAffinity");
1016 assert_se(ncpus
< 0);
1021 ncpus
= parse_cpu_set_and_warn("", &c
, NULL
, "fake", 1, "CPUAffinity");
1022 assert_se(ncpus
== 0); /* empty string returns 0 */
1025 /* Runnaway quoted string */
1026 ncpus
= parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c
, NULL
, "fake", 1, "CPUAffinity");
1027 assert_se(ncpus
< 0);
1031 static void test_config_parse_iec_uint64(void) {
1032 uint64_t offset
= 0;
1033 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset
, NULL
) == 0);
1034 assert_se(offset
== 4 * 1024 * 1024);
1036 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset
, NULL
) == 0);
1039 static void test_strextend(void) {
1040 _cleanup_free_
char *str
= strdup("0123");
1041 strextend(&str
, "456", "78", "9", NULL
);
1042 assert_se(streq(str
, "0123456789"));
1045 static void test_strrep(void) {
1046 _cleanup_free_
char *one
, *three
, *zero
;
1047 one
= strrep("waldo", 1);
1048 three
= strrep("waldo", 3);
1049 zero
= strrep("waldo", 0);
1051 assert_se(streq(one
, "waldo"));
1052 assert_se(streq(three
, "waldowaldowaldo"));
1053 assert_se(streq(zero
, ""));
1056 static void test_split_pair(void) {
1057 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
1059 assert_se(split_pair("", "", &a
, &b
) == -EINVAL
);
1060 assert_se(split_pair("foo=bar", "", &a
, &b
) == -EINVAL
);
1061 assert_se(split_pair("", "=", &a
, &b
) == -EINVAL
);
1062 assert_se(split_pair("foo=bar", "=", &a
, &b
) >= 0);
1063 assert_se(streq(a
, "foo"));
1064 assert_se(streq(b
, "bar"));
1067 assert_se(split_pair("==", "==", &a
, &b
) >= 0);
1068 assert_se(streq(a
, ""));
1069 assert_se(streq(b
, ""));
1073 assert_se(split_pair("===", "==", &a
, &b
) >= 0);
1074 assert_se(streq(a
, ""));
1075 assert_se(streq(b
, "="));
1078 static void test_fstab_node_to_udev_node(void) {
1081 n
= fstab_node_to_udev_node("LABEL=applé/jack");
1083 assert_se(streq(n
, "/dev/disk/by-label/applé\\x2fjack"));
1086 n
= fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1088 assert_se(streq(n
, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1091 n
= fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1093 assert_se(streq(n
, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1096 n
= fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1098 assert_se(streq(n
, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1101 n
= fstab_node_to_udev_node("PONIES=awesome");
1103 assert_se(streq(n
, "PONIES=awesome"));
1106 n
= fstab_node_to_udev_node("/dev/xda1");
1108 assert_se(streq(n
, "/dev/xda1"));
1112 static void test_get_files_in_directory(void) {
1113 _cleanup_strv_free_
char **l
= NULL
, **t
= NULL
;
1115 assert_se(get_files_in_directory("/tmp", &l
) >= 0);
1116 assert_se(get_files_in_directory(".", &t
) >= 0);
1117 assert_se(get_files_in_directory(".", NULL
) >= 0);
1120 static void test_in_set(void) {
1121 assert_se(IN_SET(1, 1));
1122 assert_se(IN_SET(1, 1, 2, 3, 4));
1123 assert_se(IN_SET(2, 1, 2, 3, 4));
1124 assert_se(IN_SET(3, 1, 2, 3, 4));
1125 assert_se(IN_SET(4, 1, 2, 3, 4));
1126 assert_se(!IN_SET(0, 1));
1127 assert_se(!IN_SET(0, 1, 2, 3, 4));
1130 static void test_writing_tmpfile(void) {
1131 char name
[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1132 _cleanup_free_
char *contents
= NULL
;
1135 struct iovec iov
[3];
1137 IOVEC_SET_STRING(iov
[0], "abc\n");
1138 IOVEC_SET_STRING(iov
[1], ALPHANUMERICAL
"\n");
1139 IOVEC_SET_STRING(iov
[2], "");
1141 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1142 printf("tmpfile: %s", name
);
1144 r
= writev(fd
, iov
, 3);
1147 r
= read_full_file(name
, &contents
, &size
);
1149 printf("contents: %s", contents
);
1150 assert_se(streq(contents
, "abc\n" ALPHANUMERICAL
"\n"));
1155 static void test_hexdump(void) {
1159 hexdump(stdout
, NULL
, 0);
1160 hexdump(stdout
, "", 0);
1161 hexdump(stdout
, "", 1);
1162 hexdump(stdout
, "x", 1);
1163 hexdump(stdout
, "x", 2);
1164 hexdump(stdout
, "foobar", 7);
1165 hexdump(stdout
, "f\nobar", 7);
1166 hexdump(stdout
, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1168 for (i
= 0; i
< ELEMENTSOF(data
); i
++)
1171 hexdump(stdout
, data
, sizeof(data
));
1174 static void test_log2i(void) {
1175 assert_se(log2i(1) == 0);
1176 assert_se(log2i(2) == 1);
1177 assert_se(log2i(3) == 1);
1178 assert_se(log2i(4) == 2);
1179 assert_se(log2i(32) == 5);
1180 assert_se(log2i(33) == 5);
1181 assert_se(log2i(63) == 5);
1182 assert_se(log2i(INT_MAX
) == sizeof(int)*8-2);
1185 static void test_foreach_string(void) {
1186 const char * const t
[] = {
1195 FOREACH_STRING(x
, "foo", "bar", "waldo")
1196 assert_se(streq_ptr(t
[i
++], x
));
1200 FOREACH_STRING(x
, "zzz")
1201 assert_se(streq(x
, "zzz"));
1204 static void test_filename_is_valid(void) {
1205 char foo
[FILENAME_MAX
+2];
1208 assert_se(!filename_is_valid(""));
1209 assert_se(!filename_is_valid("/bar/foo"));
1210 assert_se(!filename_is_valid("/"));
1211 assert_se(!filename_is_valid("."));
1212 assert_se(!filename_is_valid(".."));
1214 for (i
=0; i
<FILENAME_MAX
+1; i
++)
1216 foo
[FILENAME_MAX
+1] = '\0';
1218 assert_se(!filename_is_valid(foo
));
1220 assert_se(filename_is_valid("foo_bar-333"));
1221 assert_se(filename_is_valid("o.o"));
1224 static void test_string_has_cc(void) {
1225 assert_se(string_has_cc("abc\1", NULL
));
1226 assert_se(string_has_cc("abc\x7f", NULL
));
1227 assert_se(string_has_cc("abc\x7f", NULL
));
1228 assert_se(string_has_cc("abc\t\x7f", "\t"));
1229 assert_se(string_has_cc("abc\t\x7f", "\t"));
1230 assert_se(string_has_cc("\x7f", "\t"));
1231 assert_se(string_has_cc("\x7f", "\t\a"));
1233 assert_se(!string_has_cc("abc\t\t", "\t"));
1234 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1235 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1238 static void test_ascii_strlower(void) {
1239 char a
[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1240 assert_se(streq(ascii_strlower(a
), "aabbcc jk ii od lkjjj kkd lk"));
1243 static void test_files_same(void) {
1244 _cleanup_close_
int fd
= -1;
1245 char name
[] = "/tmp/test-files_same.XXXXXX";
1246 char name_alias
[] = "/tmp/test-files_same.alias";
1248 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1250 assert_se(symlink(name
, name_alias
) >= 0);
1252 assert_se(files_same(name
, name
));
1253 assert_se(files_same(name
, name_alias
));
1259 static void test_is_valid_documentation_url(void) {
1260 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1261 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1262 assert_se(documentation_url_is_valid("file:/foo/foo"));
1263 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1264 assert_se(documentation_url_is_valid("info:bar"));
1266 assert_se(!documentation_url_is_valid("foo:"));
1267 assert_se(!documentation_url_is_valid("info:"));
1268 assert_se(!documentation_url_is_valid(""));
1271 static void test_file_in_same_dir(void) {
1274 t
= file_in_same_dir("/", "a");
1275 assert_se(streq(t
, "/a"));
1278 t
= file_in_same_dir("/", "/a");
1279 assert_se(streq(t
, "/a"));
1282 t
= file_in_same_dir("", "a");
1283 assert_se(streq(t
, "a"));
1286 t
= file_in_same_dir("a/", "a");
1287 assert_se(streq(t
, "a/a"));
1290 t
= file_in_same_dir("bar/foo", "bar");
1291 assert_se(streq(t
, "bar/bar"));
1295 static void test_endswith(void) {
1296 assert_se(endswith("foobar", "bar"));
1297 assert_se(endswith("foobar", ""));
1298 assert_se(endswith("foobar", "foobar"));
1299 assert_se(endswith("", ""));
1301 assert_se(!endswith("foobar", "foo"));
1302 assert_se(!endswith("foobar", "foobarfoofoo"));
1305 static void test_endswith_no_case(void) {
1306 assert_se(endswith_no_case("fooBAR", "bar"));
1307 assert_se(endswith_no_case("foobar", ""));
1308 assert_se(endswith_no_case("foobar", "FOOBAR"));
1309 assert_se(endswith_no_case("", ""));
1311 assert_se(!endswith_no_case("foobar", "FOO"));
1312 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1315 static void test_close_nointr(void) {
1316 char name
[] = "/tmp/test-test-close_nointr.XXXXXX";
1319 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1321 assert_se(close_nointr(fd
) >= 0);
1322 assert_se(close_nointr(fd
) < 0);
1328 static void test_unlink_noerrno(void) {
1329 char name
[] = "/tmp/test-close_nointr.XXXXXX";
1332 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1334 assert_se(close_nointr(fd
) >= 0);
1339 assert_se(unlink_noerrno(name
) >= 0);
1340 assert_se(errno
== -42);
1341 assert_se(unlink_noerrno(name
) < 0);
1342 assert_se(errno
== -42);
1346 static void test_readlink_and_make_absolute(void) {
1347 char tempdir
[] = "/tmp/test-readlink_and_make_absolute";
1348 char name
[] = "/tmp/test-readlink_and_make_absolute/original";
1349 char name2
[] = "test-readlink_and_make_absolute/original";
1350 char name_alias
[] = "/tmp/test-readlink_and_make_absolute-alias";
1353 assert_se(mkdir_safe(tempdir
, 0755, getuid(), getgid()) >= 0);
1354 assert_se(touch(name
) >= 0);
1356 assert_se(symlink(name
, name_alias
) >= 0);
1357 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1358 assert_se(streq(r
, name
));
1360 assert_se(unlink(name_alias
) >= 0);
1362 assert_se(chdir(tempdir
) >= 0);
1363 assert_se(symlink(name2
, name_alias
) >= 0);
1364 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1365 assert_se(streq(r
, name
));
1367 assert_se(unlink(name_alias
) >= 0);
1369 assert_se(rm_rf(tempdir
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
1372 static void test_ignore_signals(void) {
1373 assert_se(ignore_signals(SIGINT
, -1) >= 0);
1374 assert_se(kill(getpid(), SIGINT
) >= 0);
1375 assert_se(ignore_signals(SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1376 assert_se(kill(getpid(), SIGUSR1
) >= 0);
1377 assert_se(kill(getpid(), SIGUSR2
) >= 0);
1378 assert_se(kill(getpid(), SIGTERM
) >= 0);
1379 assert_se(kill(getpid(), SIGPIPE
) >= 0);
1380 assert_se(default_signals(SIGINT
, SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1383 static void test_strshorten(void) {
1384 char s
[] = "foobar";
1386 assert_se(strlen(strshorten(s
, 6)) == 6);
1387 assert_se(strlen(strshorten(s
, 12)) == 6);
1388 assert_se(strlen(strshorten(s
, 2)) == 2);
1389 assert_se(strlen(strshorten(s
, 0)) == 0);
1392 static void test_strjoina(void) {
1395 actual
= strjoina("", "foo", "bar");
1396 assert_se(streq(actual
, "foobar"));
1398 actual
= strjoina("foo", "bar", "baz");
1399 assert_se(streq(actual
, "foobarbaz"));
1401 actual
= strjoina("foo", "", "bar", "baz");
1402 assert_se(streq(actual
, "foobarbaz"));
1404 actual
= strjoina("foo");
1405 assert_se(streq(actual
, "foo"));
1407 actual
= strjoina(NULL
);
1408 assert_se(streq(actual
, ""));
1410 actual
= strjoina(NULL
, "foo");
1411 assert_se(streq(actual
, ""));
1413 actual
= strjoina("foo", NULL
, "bar");
1414 assert_se(streq(actual
, "foo"));
1417 static void test_is_symlink(void) {
1418 char name
[] = "/tmp/test-is_symlink.XXXXXX";
1419 char name_link
[] = "/tmp/test-is_symlink.link";
1420 _cleanup_close_
int fd
= -1;
1422 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1424 assert_se(symlink(name
, name_link
) >= 0);
1426 assert_se(is_symlink(name
) == 0);
1427 assert_se(is_symlink(name_link
) == 1);
1428 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1435 static void test_search_and_fopen(void) {
1436 const char *dirs
[] = {"/tmp/foo/bar", "/tmp", NULL
};
1437 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1442 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1446 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1450 r
= search_and_fopen(name
, "r", NULL
, dirs
, &f
);
1454 r
= search_and_fopen(basename(name
), "r", "/", dirs
, &f
);
1458 r
= search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1460 r
= search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1466 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1471 static void test_search_and_fopen_nulstr(void) {
1472 const char dirs
[] = "/tmp/foo/bar\0/tmp\0";
1473 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1478 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1482 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1486 r
= search_and_fopen_nulstr(name
, "r", NULL
, dirs
, &f
);
1490 r
= search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1492 r
= search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1498 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1502 static void test_glob_exists(void) {
1503 char name
[] = "/tmp/test-glob_exists.XXXXXX";
1507 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1511 r
= glob_exists("/tmp/test-glob_exists*");
1516 r
= glob_exists("/tmp/test-glob_exists*");
1520 static void test_execute_directory(void) {
1521 char template_lo
[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1522 char template_hi
[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1523 const char * dirs
[] = {template_hi
, template_lo
, NULL
};
1524 const char *name
, *name2
, *name3
, *overridden
, *override
, *masked
, *mask
;
1526 assert_se(mkdtemp(template_lo
));
1527 assert_se(mkdtemp(template_hi
));
1529 name
= strjoina(template_lo
, "/script");
1530 name2
= strjoina(template_hi
, "/script2");
1531 name3
= strjoina(template_lo
, "/useless");
1532 overridden
= strjoina(template_lo
, "/overridden");
1533 override
= strjoina(template_hi
, "/overridden");
1534 masked
= strjoina(template_lo
, "/masked");
1535 mask
= strjoina(template_hi
, "/masked");
1537 assert_se(write_string_file(name
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE
) == 0);
1538 assert_se(write_string_file(name2
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE
) == 0);
1539 assert_se(write_string_file(overridden
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1540 assert_se(write_string_file(override
, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE
) == 0);
1541 assert_se(write_string_file(masked
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1542 assert_se(symlink("/dev/null", mask
) == 0);
1543 assert_se(chmod(name
, 0755) == 0);
1544 assert_se(chmod(name2
, 0755) == 0);
1545 assert_se(chmod(overridden
, 0755) == 0);
1546 assert_se(chmod(override
, 0755) == 0);
1547 assert_se(chmod(masked
, 0755) == 0);
1548 assert_se(touch(name3
) >= 0);
1550 execute_directories(dirs
, DEFAULT_TIMEOUT_USEC
, NULL
);
1552 assert_se(chdir(template_lo
) == 0);
1553 assert_se(access("it_works", F_OK
) >= 0);
1554 assert_se(access("failed", F_OK
) < 0);
1556 assert_se(chdir(template_hi
) == 0);
1557 assert_se(access("it_works2", F_OK
) >= 0);
1558 assert_se(access("failed", F_OK
) < 0);
1560 (void) rm_rf(template_lo
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1561 (void) rm_rf(template_hi
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1564 static void test_extract_first_word(void) {
1565 const char *p
, *original
;
1568 p
= original
= "foobar waldo";
1569 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1570 assert_se(streq(t
, "foobar"));
1572 assert_se(p
== original
+ 7);
1574 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1575 assert_se(streq(t
, "waldo"));
1577 assert_se(isempty(p
));
1579 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1581 assert_se(isempty(p
));
1583 p
= original
= "\"foobar\" \'waldo\'";
1584 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1585 assert_se(streq(t
, "\"foobar\""));
1587 assert_se(p
== original
+ 9);
1589 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1590 assert_se(streq(t
, "\'waldo\'"));
1592 assert_se(isempty(p
));
1594 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1596 assert_se(isempty(p
));
1598 p
= original
= "\"foobar\" \'waldo\'";
1599 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1600 assert_se(streq(t
, "foobar"));
1602 assert_se(p
== original
+ 9);
1604 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1605 assert_se(streq(t
, "waldo"));
1607 assert_se(isempty(p
));
1609 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1611 assert_se(isempty(p
));
1613 p
= original
= "\"";
1614 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1615 assert_se(streq(t
, "\""));
1617 assert_se(isempty(p
));
1619 p
= original
= "\"";
1620 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1621 assert_se(p
== original
+ 1);
1623 p
= original
= "\'";
1624 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1625 assert_se(streq(t
, "\'"));
1627 assert_se(isempty(p
));
1629 p
= original
= "\'";
1630 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1631 assert_se(p
== original
+ 1);
1633 p
= original
= "\'fooo";
1634 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1635 assert_se(streq(t
, "\'fooo"));
1637 assert_se(isempty(p
));
1639 p
= original
= "\'fooo";
1640 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1641 assert_se(p
== original
+ 5);
1643 p
= original
= "\'fooo";
1644 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1645 assert_se(streq(t
, "fooo"));
1647 assert_se(isempty(p
));
1649 p
= original
= "\"fooo";
1650 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1651 assert_se(streq(t
, "fooo"));
1653 assert_se(isempty(p
));
1655 p
= original
= "yay\'foo\'bar";
1656 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1657 assert_se(streq(t
, "yay\'foo\'bar"));
1659 assert_se(isempty(p
));
1661 p
= original
= "yay\'foo\'bar";
1662 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1663 assert_se(streq(t
, "yayfoobar"));
1665 assert_se(isempty(p
));
1667 p
= original
= " foobar ";
1668 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1669 assert_se(streq(t
, "foobar"));
1671 assert_se(isempty(p
));
1673 p
= original
= " foo\\ba\\x6ar ";
1674 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1675 assert_se(streq(t
, "foo\ba\x6ar"));
1677 assert_se(isempty(p
));
1679 p
= original
= " foo\\ba\\x6ar ";
1680 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1681 assert_se(streq(t
, "foobax6ar"));
1683 assert_se(isempty(p
));
1685 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1686 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1687 assert_se(streq(t
, "föo"));
1689 assert_se(p
== original
+ 13);
1691 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
) > 0);
1692 assert_se(streq(t
, "pi\360\237\222\251le"));
1694 assert_se(isempty(p
));
1696 p
= original
= "fooo\\";
1697 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1698 assert_se(streq(t
, "fooo"));
1700 assert_se(isempty(p
));
1702 p
= original
= "fooo\\";
1703 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1704 assert_se(streq(t
, "fooo\\"));
1706 assert_se(isempty(p
));
1708 p
= original
= "fooo\\";
1709 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1710 assert_se(streq(t
, "fooo\\"));
1712 assert_se(isempty(p
));
1714 p
= original
= "fooo\\";
1715 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1716 assert_se(streq(t
, "fooo\\"));
1718 assert_se(isempty(p
));
1720 p
= original
= "\"foo\\";
1721 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == -EINVAL
);
1722 assert_se(p
== original
+ 5);
1724 p
= original
= "\"foo\\";
1725 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1726 assert_se(streq(t
, "foo"));
1728 assert_se(isempty(p
));
1730 p
= original
= "foo::bar";
1731 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1732 assert_se(streq(t
, "foo"));
1734 assert_se(p
== original
+ 5);
1736 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1737 assert_se(streq(t
, "bar"));
1739 assert_se(isempty(p
));
1741 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1743 assert_se(isempty(p
));
1745 p
= original
= "foo\\:bar::waldo";
1746 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1747 assert_se(streq(t
, "foo:bar"));
1749 assert_se(p
== original
+ 10);
1751 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1752 assert_se(streq(t
, "waldo"));
1754 assert_se(isempty(p
));
1756 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1758 assert_se(isempty(p
));
1760 p
= original
= "\"foo\\";
1761 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
) == -EINVAL
);
1762 assert_se(p
== original
+ 5);
1764 p
= original
= "\"foo\\";
1765 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1766 assert_se(streq(t
, "foo\\"));
1768 assert_se(isempty(p
));
1770 p
= original
= "\"foo\\";
1771 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1772 assert_se(streq(t
, "foo\\"));
1774 assert_se(isempty(p
));
1776 p
= original
= "fooo\\ bar quux";
1777 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1778 assert_se(streq(t
, "fooo bar"));
1780 assert_se(p
== original
+ 10);
1782 p
= original
= "fooo\\ bar quux";
1783 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1784 assert_se(streq(t
, "fooo bar"));
1786 assert_se(p
== original
+ 10);
1788 p
= original
= "fooo\\ bar quux";
1789 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1790 assert_se(streq(t
, "fooo bar"));
1792 assert_se(p
== original
+ 10);
1794 p
= original
= "fooo\\ bar quux";
1795 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1796 assert_se(p
== original
+ 5);
1798 p
= original
= "fooo\\ bar quux";
1799 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1800 assert_se(streq(t
, "fooo\\ bar"));
1802 assert_se(p
== original
+ 10);
1804 p
= original
= "\\w+@\\K[\\d.]+";
1805 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1806 assert_se(p
== original
+ 1);
1808 p
= original
= "\\w+@\\K[\\d.]+";
1809 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1810 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1812 assert_se(isempty(p
));
1814 p
= original
= "\\w+\\b";
1815 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1816 assert_se(streq(t
, "\\w+\b"));
1818 assert_se(isempty(p
));
1820 p
= original
= "-N ''";
1821 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1822 assert_se(streq(t
, "-N"));
1824 assert_se(p
== original
+ 3);
1826 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1827 assert_se(streq(t
, ""));
1829 assert_se(isempty(p
));
1831 p
= original
= ":foo\\:bar::waldo:";
1832 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1834 assert_se(streq(t
, ""));
1836 assert_se(p
== original
+ 1);
1838 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1839 assert_se(streq(t
, "foo:bar"));
1841 assert_se(p
== original
+ 10);
1843 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1845 assert_se(streq(t
, ""));
1847 assert_se(p
== original
+ 11);
1849 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1850 assert_se(streq(t
, "waldo"));
1852 assert_se(p
== original
+ 17);
1854 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1855 assert_se(streq(t
, ""));
1857 assert_se(p
== NULL
);
1859 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 0);
1864 static void test_extract_first_word_and_warn(void) {
1865 const char *p
, *original
;
1868 p
= original
= "foobar waldo";
1869 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1870 assert_se(streq(t
, "foobar"));
1872 assert_se(p
== original
+ 7);
1874 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1875 assert_se(streq(t
, "waldo"));
1877 assert_se(isempty(p
));
1879 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1881 assert_se(isempty(p
));
1883 p
= original
= "\"foobar\" \'waldo\'";
1884 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1885 assert_se(streq(t
, "foobar"));
1887 assert_se(p
== original
+ 9);
1889 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1890 assert_se(streq(t
, "waldo"));
1892 assert_se(isempty(p
));
1894 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1896 assert_se(isempty(p
));
1898 p
= original
= "\"";
1899 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1900 assert_se(p
== original
+ 1);
1902 p
= original
= "\'";
1903 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1904 assert_se(p
== original
+ 1);
1906 p
= original
= "\'fooo";
1907 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1908 assert_se(p
== original
+ 5);
1910 p
= original
= "\'fooo";
1911 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1912 assert_se(streq(t
, "fooo"));
1914 assert_se(isempty(p
));
1916 p
= original
= " foo\\ba\\x6ar ";
1917 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1918 assert_se(streq(t
, "foo\ba\x6ar"));
1920 assert_se(isempty(p
));
1922 p
= original
= " foo\\ba\\x6ar ";
1923 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1924 assert_se(streq(t
, "foobax6ar"));
1926 assert_se(isempty(p
));
1928 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1929 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1930 assert_se(streq(t
, "föo"));
1932 assert_se(p
== original
+ 13);
1934 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1935 assert_se(streq(t
, "pi\360\237\222\251le"));
1937 assert_se(isempty(p
));
1939 p
= original
= "fooo\\";
1940 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1941 assert_se(streq(t
, "fooo"));
1943 assert_se(isempty(p
));
1945 p
= original
= "fooo\\";
1946 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1947 assert_se(streq(t
, "fooo\\"));
1949 assert_se(isempty(p
));
1951 p
= original
= "fooo\\";
1952 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1953 assert_se(streq(t
, "fooo\\"));
1955 assert_se(isempty(p
));
1957 p
= original
= "\"foo\\";
1958 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1959 assert_se(p
== original
+ 5);
1961 p
= original
= "\"foo\\";
1962 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1963 assert_se(streq(t
, "foo"));
1965 assert_se(isempty(p
));
1967 p
= original
= "\"foo\\";
1968 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) == -EINVAL
);
1969 assert_se(p
== original
+ 5);
1971 p
= original
= "\"foo\\";
1972 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1973 assert_se(streq(t
, "foo"));
1975 assert_se(isempty(p
));
1977 p
= original
= "fooo\\ bar quux";
1978 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1979 assert_se(streq(t
, "fooo bar"));
1981 assert_se(p
== original
+ 10);
1983 p
= original
= "fooo\\ bar quux";
1984 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1985 assert_se(streq(t
, "fooo bar"));
1987 assert_se(p
== original
+ 10);
1989 p
= original
= "fooo\\ bar quux";
1990 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1991 assert_se(streq(t
, "fooo\\ bar"));
1993 assert_se(p
== original
+ 10);
1995 p
= original
= "\\w+@\\K[\\d.]+";
1996 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1997 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1999 assert_se(isempty(p
));
2001 p
= original
= "\\w+\\b";
2002 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
2003 assert_se(streq(t
, "\\w+\b"));
2005 assert_se(isempty(p
));
2008 static void test_extract_many_words(void) {
2009 const char *p
, *original
;
2012 p
= original
= "foobar waldi piep";
2013 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 3);
2014 assert_se(isempty(p
));
2015 assert_se(streq_ptr(a
, "foobar"));
2016 assert_se(streq_ptr(b
, "waldi"));
2017 assert_se(streq_ptr(c
, "piep"));
2022 p
= original
= "'foobar' wa\"ld\"i ";
2023 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 2);
2024 assert_se(isempty(p
));
2025 assert_se(streq_ptr(a
, "'foobar'"));
2026 assert_se(streq_ptr(b
, "wa\"ld\"i"));
2027 assert_se(streq_ptr(c
, NULL
));
2031 p
= original
= "'foobar' wa\"ld\"i ";
2032 assert_se(extract_many_words(&p
, NULL
, EXTRACT_QUOTES
, &a
, &b
, &c
, NULL
) == 2);
2033 assert_se(isempty(p
));
2034 assert_se(streq_ptr(a
, "foobar"));
2035 assert_se(streq_ptr(b
, "waldi"));
2036 assert_se(streq_ptr(c
, NULL
));
2041 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2042 assert_se(isempty(p
));
2043 assert_se(streq_ptr(a
, NULL
));
2044 assert_se(streq_ptr(b
, NULL
));
2045 assert_se(streq_ptr(c
, NULL
));
2048 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2049 assert_se(isempty(p
));
2050 assert_se(streq_ptr(a
, NULL
));
2051 assert_se(streq_ptr(b
, NULL
));
2052 assert_se(streq_ptr(c
, NULL
));
2054 p
= original
= "foobar";
2055 assert_se(extract_many_words(&p
, NULL
, 0, NULL
) == 0);
2056 assert_se(p
== original
);
2058 p
= original
= "foobar waldi";
2059 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2060 assert_se(p
== original
+7);
2061 assert_se(streq_ptr(a
, "foobar"));
2064 p
= original
= " foobar ";
2065 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2066 assert_se(isempty(p
));
2067 assert_se(streq_ptr(a
, "foobar"));
2071 static int parse_item(const char *key
, const char *value
) {
2074 log_info("kernel cmdline option <%s> = <%s>", key
, strna(value
));
2078 static void test_parse_proc_cmdline(void) {
2079 assert_se(parse_proc_cmdline(parse_item
) >= 0);
2082 static void test_raw_clone(void) {
2083 pid_t parent
, pid
, pid2
;
2086 log_info("before clone: getpid()→"PID_FMT
, parent
);
2087 assert_se(raw_getpid() == parent
);
2089 pid
= raw_clone(0, NULL
);
2090 assert_se(pid
>= 0);
2092 pid2
= raw_getpid();
2093 log_info("raw_clone: "PID_FMT
" getpid()→"PID_FMT
" raw_getpid()→"PID_FMT
,
2094 pid
, getpid(), pid2
);
2096 assert_se(pid2
!= parent
);
2097 _exit(EXIT_SUCCESS
);
2101 assert_se(pid2
== parent
);
2102 waitpid(pid
, &status
, __WCLONE
);
2103 assert_se(WIFEXITED(status
) && WEXITSTATUS(status
) == EXIT_SUCCESS
);
2107 static void test_same_fd(void) {
2108 _cleanup_close_pair_
int p
[2] = { -1, -1 };
2109 _cleanup_close_
int a
= -1, b
= -1, c
= -1;
2111 assert_se(pipe2(p
, O_CLOEXEC
) >= 0);
2112 assert_se((a
= dup(p
[0])) >= 0);
2113 assert_se((b
= open("/dev/null", O_RDONLY
|O_CLOEXEC
)) >= 0);
2114 assert_se((c
= dup(a
)) >= 0);
2116 assert_se(same_fd(p
[0], p
[0]) > 0);
2117 assert_se(same_fd(p
[1], p
[1]) > 0);
2118 assert_se(same_fd(a
, a
) > 0);
2119 assert_se(same_fd(b
, b
) > 0);
2121 assert_se(same_fd(a
, p
[0]) > 0);
2122 assert_se(same_fd(p
[0], a
) > 0);
2123 assert_se(same_fd(c
, p
[0]) > 0);
2124 assert_se(same_fd(p
[0], c
) > 0);
2125 assert_se(same_fd(a
, c
) > 0);
2126 assert_se(same_fd(c
, a
) > 0);
2128 assert_se(same_fd(p
[0], p
[1]) == 0);
2129 assert_se(same_fd(p
[1], p
[0]) == 0);
2130 assert_se(same_fd(p
[0], b
) == 0);
2131 assert_se(same_fd(b
, p
[0]) == 0);
2132 assert_se(same_fd(p
[1], a
) == 0);
2133 assert_se(same_fd(a
, p
[1]) == 0);
2134 assert_se(same_fd(p
[1], b
) == 0);
2135 assert_se(same_fd(b
, p
[1]) == 0);
2137 assert_se(same_fd(a
, b
) == 0);
2138 assert_se(same_fd(b
, a
) == 0);
2141 static void test_uid_ptr(void) {
2143 assert_se(UID_TO_PTR(0) != NULL
);
2144 assert_se(UID_TO_PTR(1000) != NULL
);
2146 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2147 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2150 static void test_sparse_write_one(int fd
, const char *buffer
, size_t n
) {
2153 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2154 assert_se(ftruncate(fd
, 0) >= 0);
2155 assert_se(sparse_write(fd
, buffer
, n
, 4) == (ssize_t
) n
);
2157 assert_se(lseek(fd
, 0, SEEK_CUR
) == (off_t
) n
);
2158 assert_se(ftruncate(fd
, n
) >= 0);
2160 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2161 assert_se(read(fd
, check
, n
) == (ssize_t
) n
);
2163 assert_se(memcmp(buffer
, check
, n
) == 0);
2166 static void test_sparse_write(void) {
2167 const char test_a
[] = "test";
2168 const char test_b
[] = "\0\0\0\0test\0\0\0\0";
2169 const char test_c
[] = "\0\0test\0\0\0\0";
2170 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";
2171 const char test_e
[] = "test\0\0\0\0test";
2172 _cleanup_close_
int fd
= -1;
2173 char fn
[] = "/tmp/sparseXXXXXX";
2175 fd
= mkostemp(fn
, O_CLOEXEC
);
2179 test_sparse_write_one(fd
, test_a
, sizeof(test_a
));
2180 test_sparse_write_one(fd
, test_b
, sizeof(test_b
));
2181 test_sparse_write_one(fd
, test_c
, sizeof(test_c
));
2182 test_sparse_write_one(fd
, test_d
, sizeof(test_d
));
2183 test_sparse_write_one(fd
, test_e
, sizeof(test_e
));
2186 static void test_shell_escape_one(const char *s
, const char *bad
, const char *expected
) {
2187 _cleanup_free_
char *r
;
2189 assert_se(r
= shell_escape(s
, bad
));
2190 assert_se(streq_ptr(r
, expected
));
2193 static void test_shell_escape(void) {
2194 test_shell_escape_one("", "", "");
2195 test_shell_escape_one("\\", "", "\\\\");
2196 test_shell_escape_one("foobar", "", "foobar");
2197 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2198 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2201 static void test_shell_maybe_quote_one(const char *s
, const char *expected
) {
2202 _cleanup_free_
char *r
;
2204 assert_se(r
= shell_maybe_quote(s
));
2205 assert_se(streq(r
, expected
));
2208 static void test_shell_maybe_quote(void) {
2210 test_shell_maybe_quote_one("", "");
2211 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2212 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2213 test_shell_maybe_quote_one("foobar", "foobar");
2214 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2215 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2216 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2219 static void test_parse_mode(void) {
2222 assert_se(parse_mode("-1", &m
) < 0);
2223 assert_se(parse_mode("", &m
) < 0);
2224 assert_se(parse_mode("888", &m
) < 0);
2225 assert_se(parse_mode("77777", &m
) < 0);
2227 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
2228 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
2229 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
2230 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
2233 static void test_tempfn(void) {
2234 char *ret
= NULL
, *p
;
2236 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL
, &ret
) >= 0);
2237 assert_se(streq_ptr(ret
, "/foo/bar/.#waldoXXXXXX"));
2240 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret
) >= 0);
2241 assert_se(streq_ptr(ret
, "/foo/bar/.#[miau]waldoXXXXXX"));
2244 assert_se(tempfn_random("/foo/bar/waldo", NULL
, &ret
) >= 0);
2245 assert_se(p
= startswith(ret
, "/foo/bar/.#waldo"));
2246 assert_se(strlen(p
) == 16);
2247 assert_se(in_charset(p
, "0123456789abcdef"));
2250 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret
) >= 0);
2251 assert_se(p
= startswith(ret
, "/foo/bar/.#[wuff]waldo"));
2252 assert_se(strlen(p
) == 16);
2253 assert_se(in_charset(p
, "0123456789abcdef"));
2256 assert_se(tempfn_random_child("/foo/bar/waldo", NULL
, &ret
) >= 0);
2257 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#"));
2258 assert_se(strlen(p
) == 16);
2259 assert_se(in_charset(p
, "0123456789abcdef"));
2262 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret
) >= 0);
2263 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#[kikiriki]"));
2264 assert_se(strlen(p
) == 16);
2265 assert_se(in_charset(p
, "0123456789abcdef"));
2269 static void test_strcmp_ptr(void) {
2270 assert_se(strcmp_ptr(NULL
, NULL
) == 0);
2271 assert_se(strcmp_ptr("", NULL
) > 0);
2272 assert_se(strcmp_ptr("foo", NULL
) > 0);
2273 assert_se(strcmp_ptr(NULL
, "") < 0);
2274 assert_se(strcmp_ptr(NULL
, "bar") < 0);
2275 assert_se(strcmp_ptr("foo", "bar") > 0);
2276 assert_se(strcmp_ptr("bar", "baz") < 0);
2277 assert_se(strcmp_ptr("foo", "foo") == 0);
2278 assert_se(strcmp_ptr("", "") == 0);
2281 static void test_fgetxattrat_fake(void) {
2282 char t
[] = "/var/tmp/xattrtestXXXXXX";
2283 _cleanup_close_
int fd
= -1;
2288 assert_se(mkdtemp(t
));
2289 x
= strjoina(t
, "/test");
2290 assert_se(touch(x
) >= 0);
2292 r
= setxattr(x
, "user.foo", "bar", 3, 0);
2293 if (r
< 0 && errno
== EOPNOTSUPP
) /* no xattrs supported on /var/tmp... */
2297 fd
= open(t
, O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2300 assert_se(fgetxattrat_fake(fd
, "test", "user.foo", v
, 3, 0) >= 0);
2301 assert_se(memcmp(v
, "bar", 3) == 0);
2304 fd
= open("/", O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2306 assert_se(fgetxattrat_fake(fd
, "usr", "user.idontexist", v
, 3, 0) == -ENODATA
);
2309 assert_se(unlink(x
) >= 0);
2310 assert_se(rmdir(t
) >= 0);
2313 int main(int argc
, char *argv
[]) {
2314 log_parse_environment();
2318 test_align_power2();
2320 test_container_of();
2322 test_div_round_up();
2325 test_parse_boolean();
2334 test_delete_chars();
2338 test_base32hexchar();
2339 test_unbase32hexchar();
2341 test_unbase64char();
2347 test_base32hexmem();
2348 test_unbase32hexmem();
2353 test_foreach_word();
2354 test_foreach_word_quoted();
2355 test_memdup_multiply();
2357 test_protect_errno();
2359 test_parse_cpu_set();
2360 test_config_parse_iec_uint64();
2364 test_fstab_node_to_udev_node();
2365 test_get_files_in_directory();
2367 test_writing_tmpfile();
2370 test_foreach_string();
2371 test_filename_is_valid();
2372 test_string_has_cc();
2373 test_ascii_strlower();
2375 test_is_valid_documentation_url();
2376 test_file_in_same_dir();
2378 test_endswith_no_case();
2379 test_close_nointr();
2380 test_unlink_noerrno();
2381 test_readlink_and_make_absolute();
2382 test_ignore_signals();
2386 test_search_and_fopen();
2387 test_search_and_fopen_nulstr();
2389 test_execute_directory();
2390 test_extract_first_word();
2391 test_extract_first_word_and_warn();
2392 test_extract_many_words();
2393 test_parse_proc_cmdline();
2397 test_sparse_write();
2398 test_shell_escape();
2399 test_shell_maybe_quote();
2403 test_fgetxattrat_fake();