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"
41 #include "fstab-util.h"
42 #include "hexdecoct.h"
45 #include "parse-util.h"
46 #include "path-util.h"
47 #include "process-util.h"
49 #include "signal-util.h"
50 #include "string-util.h"
52 #include "user-util.h"
55 #include "xattr-util.h"
57 static void test_streq_ptr(void) {
58 assert_se(streq_ptr(NULL
, NULL
));
59 assert_se(!streq_ptr("abc", "cdef"));
62 static void test_align_power2(void) {
65 assert_se(ALIGN_POWER2(0) == 0);
66 assert_se(ALIGN_POWER2(1) == 1);
67 assert_se(ALIGN_POWER2(2) == 2);
68 assert_se(ALIGN_POWER2(3) == 4);
69 assert_se(ALIGN_POWER2(12) == 16);
71 assert_se(ALIGN_POWER2(ULONG_MAX
) == 0);
72 assert_se(ALIGN_POWER2(ULONG_MAX
- 1) == 0);
73 assert_se(ALIGN_POWER2(ULONG_MAX
- 1024) == 0);
74 assert_se(ALIGN_POWER2(ULONG_MAX
/ 2) == ULONG_MAX
/ 2 + 1);
75 assert_se(ALIGN_POWER2(ULONG_MAX
+ 1) == 0);
77 for (i
= 1; i
< 131071; ++i
) {
78 for (p2
= 1; p2
< i
; p2
<<= 1)
81 assert_se(ALIGN_POWER2(i
) == p2
);
84 for (i
= ULONG_MAX
- 1024; i
< ULONG_MAX
; ++i
) {
85 for (p2
= 1; p2
&& p2
< i
; p2
<<= 1)
88 assert_se(ALIGN_POWER2(i
) == p2
);
92 static void test_max(void) {
95 int b
[CONST_MAX(10, 100)];
97 .a
= CONST_MAX(10, 100),
101 assert_cc(sizeof(val1
.b
) == sizeof(int) * 100);
103 /* CONST_MAX returns (void) instead of a value if the passed arguments
104 * are not of the same type or not constant expressions. */
105 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
106 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
108 assert_se(val1
.a
== 100);
109 assert_se(MAX(++d
, 0) == 1);
112 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
113 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
114 assert_cc(MAXSIZE(char, long) == sizeof(long));
116 assert_se(MAX(-5, 5) == 5);
117 assert_se(MAX(5, 5) == 5);
118 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
119 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
120 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
121 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
122 assert_se(LESS_BY(8, 4) == 4);
123 assert_se(LESS_BY(8, 8) == 0);
124 assert_se(LESS_BY(4, 8) == 0);
125 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
126 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
127 assert_se(CLAMP(-5, 0, 1) == 0);
128 assert_se(CLAMP(5, 0, 1) == 1);
129 assert_se(CLAMP(5, -10, 1) == 1);
130 assert_se(CLAMP(5, -10, 10) == 5);
131 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
134 static void test_container_of(void) {
140 } _packed_ myval
= { };
142 assert_cc(sizeof(myval
) == 17);
143 assert_se(container_of(&myval
.v1
, struct mytype
, v1
) == &myval
);
144 assert_se(container_of(&myval
.v2
, struct mytype
, v2
) == &myval
);
145 assert_se(container_of(&container_of(&myval
.v2
,
152 static void test_alloca(void) {
153 static const uint8_t zero
[997] = { };
156 t
= alloca_align(17, 512);
157 assert_se(!((uintptr_t)t
& 0xff));
160 t
= alloca0_align(997, 1024);
161 assert_se(!((uintptr_t)t
& 0x1ff));
162 assert_se(!memcmp(t
, zero
, 997));
165 static void test_div_round_up(void) {
169 assert_se(DIV_ROUND_UP(0, 8) == 0);
170 assert_se(DIV_ROUND_UP(1, 8) == 1);
171 assert_se(DIV_ROUND_UP(8, 8) == 1);
172 assert_se(DIV_ROUND_UP(12, 8) == 2);
173 assert_se(DIV_ROUND_UP(16, 8) == 2);
175 /* test multiple evaluation */
177 assert_se(DIV_ROUND_UP(div
++, 8) == 0 && div
== 1);
178 assert_se(DIV_ROUND_UP(++div
, 8) == 1 && div
== 2);
179 assert_se(DIV_ROUND_UP(8, div
++) == 4 && div
== 3);
180 assert_se(DIV_ROUND_UP(8, ++div
) == 2 && div
== 4);
182 /* overflow test with exact division */
183 assert_se(sizeof(0U) == 4);
184 assert_se(0xfffffffaU
% 10U == 0U);
185 assert_se(0xfffffffaU
/ 10U == 429496729U);
186 assert_se(DIV_ROUND_UP(0xfffffffaU
, 10U) == 429496729U);
187 assert_se((0xfffffffaU
+ 10U - 1U) / 10U == 0U);
188 assert_se(0xfffffffaU
/ 10U + !!(0xfffffffaU
% 10U) == 429496729U);
190 /* overflow test with rounded division */
191 assert_se(0xfffffffdU
% 10U == 3U);
192 assert_se(0xfffffffdU
/ 10U == 429496729U);
193 assert_se(DIV_ROUND_UP(0xfffffffdU
, 10U) == 429496730U);
194 assert_se((0xfffffffdU
+ 10U - 1U) / 10U == 0U);
195 assert_se(0xfffffffdU
/ 10U + !!(0xfffffffdU
% 10U) == 429496730U);
198 static void test_first_word(void) {
199 assert_se(first_word("Hello", ""));
200 assert_se(first_word("Hello", "Hello"));
201 assert_se(first_word("Hello world", "Hello"));
202 assert_se(first_word("Hello\tworld", "Hello"));
203 assert_se(first_word("Hello\nworld", "Hello"));
204 assert_se(first_word("Hello\rworld", "Hello"));
205 assert_se(first_word("Hello ", "Hello"));
207 assert_se(!first_word("Hello", "Hellooo"));
208 assert_se(!first_word("Hello", "xxxxx"));
209 assert_se(!first_word("Hellooo", "Hello"));
212 static void test_close_many(void) {
214 char name0
[] = "/tmp/test-close-many.XXXXXX";
215 char name1
[] = "/tmp/test-close-many.XXXXXX";
216 char name2
[] = "/tmp/test-close-many.XXXXXX";
218 fds
[0] = mkostemp_safe(name0
, O_RDWR
|O_CLOEXEC
);
219 fds
[1] = mkostemp_safe(name1
, O_RDWR
|O_CLOEXEC
);
220 fds
[2] = mkostemp_safe(name2
, O_RDWR
|O_CLOEXEC
);
224 assert_se(fcntl(fds
[0], F_GETFD
) == -1);
225 assert_se(fcntl(fds
[1], F_GETFD
) == -1);
226 assert_se(fcntl(fds
[2], F_GETFD
) >= 0);
235 static void test_parse_boolean(void) {
236 assert_se(parse_boolean("1") == 1);
237 assert_se(parse_boolean("y") == 1);
238 assert_se(parse_boolean("Y") == 1);
239 assert_se(parse_boolean("yes") == 1);
240 assert_se(parse_boolean("YES") == 1);
241 assert_se(parse_boolean("true") == 1);
242 assert_se(parse_boolean("TRUE") == 1);
243 assert_se(parse_boolean("on") == 1);
244 assert_se(parse_boolean("ON") == 1);
246 assert_se(parse_boolean("0") == 0);
247 assert_se(parse_boolean("n") == 0);
248 assert_se(parse_boolean("N") == 0);
249 assert_se(parse_boolean("no") == 0);
250 assert_se(parse_boolean("NO") == 0);
251 assert_se(parse_boolean("false") == 0);
252 assert_se(parse_boolean("FALSE") == 0);
253 assert_se(parse_boolean("off") == 0);
254 assert_se(parse_boolean("OFF") == 0);
256 assert_se(parse_boolean("garbage") < 0);
257 assert_se(parse_boolean("") < 0);
258 assert_se(parse_boolean("full") < 0);
261 static void test_parse_pid(void) {
265 r
= parse_pid("100", &pid
);
267 assert_se(pid
== 100);
269 r
= parse_pid("0x7FFFFFFF", &pid
);
271 assert_se(pid
== 2147483647);
273 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
274 r
= parse_pid("0", &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("-100", &pid
);
280 assert_se(r
== -ERANGE
);
281 assert_se(pid
== 65);
283 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
284 r
= parse_pid("0xFFFFFFFFFFFFFFFFF", &pid
);
285 assert_se(r
== -ERANGE
);
286 assert_se(pid
== 65);
288 r
= parse_pid("junk", &pid
);
289 assert_se(r
== -EINVAL
);
292 static void test_parse_uid(void) {
296 r
= parse_uid("100", &uid
);
298 assert_se(uid
== 100);
300 r
= parse_uid("65535", &uid
);
301 assert_se(r
== -ENXIO
);
303 r
= parse_uid("asdsdas", &uid
);
304 assert_se(r
== -EINVAL
);
307 static void test_safe_atou16(void) {
311 r
= safe_atou16("12345", &l
);
313 assert_se(l
== 12345);
315 r
= safe_atou16("123456", &l
);
316 assert_se(r
== -ERANGE
);
318 r
= safe_atou16("junk", &l
);
319 assert_se(r
== -EINVAL
);
322 static void test_safe_atoi16(void) {
326 r
= safe_atoi16("-12345", &l
);
328 assert_se(l
== -12345);
330 r
= safe_atoi16("36536", &l
);
331 assert_se(r
== -ERANGE
);
333 r
= safe_atoi16("junk", &l
);
334 assert_se(r
== -EINVAL
);
337 static void test_safe_atolli(void) {
341 r
= safe_atolli("12345", &l
);
343 assert_se(l
== 12345);
345 r
= safe_atolli("junk", &l
);
346 assert_se(r
== -EINVAL
);
349 static void test_safe_atod(void) {
354 r
= safe_atod("junk", &d
);
355 assert_se(r
== -EINVAL
);
357 r
= safe_atod("0.2244", &d
);
359 assert_se(fabs(d
- 0.2244) < 0.000001);
361 r
= safe_atod("0,5", &d
);
362 assert_se(r
== -EINVAL
);
366 assert_se(*e
== ',');
368 /* Check if this really is locale independent */
369 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
371 r
= safe_atod("0.2244", &d
);
373 assert_se(fabs(d
- 0.2244) < 0.000001);
375 r
= safe_atod("0,5", &d
);
376 assert_se(r
== -EINVAL
);
379 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
382 /* And check again, reset */
383 assert_se(setlocale(LC_NUMERIC
, "C"));
385 r
= safe_atod("0.2244", &d
);
387 assert_se(fabs(d
- 0.2244) < 0.000001);
389 r
= safe_atod("0,5", &d
);
390 assert_se(r
== -EINVAL
);
394 assert_se(*e
== ',');
397 static void test_strappend(void) {
398 _cleanup_free_
char *t1
, *t2
, *t3
, *t4
;
400 t1
= strappend(NULL
, NULL
);
401 assert_se(streq(t1
, ""));
403 t2
= strappend(NULL
, "suf");
404 assert_se(streq(t2
, "suf"));
406 t3
= strappend("pre", NULL
);
407 assert_se(streq(t3
, "pre"));
409 t4
= strappend("pre", "suf");
410 assert_se(streq(t4
, "presuf"));
413 static void test_strstrip(void) {
415 char input
[] = " hello, waldo. ";
418 assert_se(streq(r
, "hello, waldo."));
421 static void test_delete_chars(void) {
423 char input
[] = " hello, waldo. abc";
425 r
= delete_chars(input
, WHITESPACE
);
426 assert_se(streq(r
, "hello,waldo.abc"));
429 static void test_in_charset(void) {
430 assert_se(in_charset("dddaaabbbcccc", "abcd"));
431 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
434 static void test_hexchar(void) {
435 assert_se(hexchar(0xa) == 'a');
436 assert_se(hexchar(0x0) == '0');
439 static void test_unhexchar(void) {
440 assert_se(unhexchar('a') == 0xA);
441 assert_se(unhexchar('A') == 0xA);
442 assert_se(unhexchar('0') == 0x0);
445 static void test_base32hexchar(void) {
446 assert_se(base32hexchar(0) == '0');
447 assert_se(base32hexchar(9) == '9');
448 assert_se(base32hexchar(10) == 'A');
449 assert_se(base32hexchar(31) == 'V');
452 static void test_unbase32hexchar(void) {
453 assert_se(unbase32hexchar('0') == 0);
454 assert_se(unbase32hexchar('9') == 9);
455 assert_se(unbase32hexchar('A') == 10);
456 assert_se(unbase32hexchar('V') == 31);
457 assert_se(unbase32hexchar('=') == -EINVAL
);
460 static void test_base64char(void) {
461 assert_se(base64char(0) == 'A');
462 assert_se(base64char(26) == 'a');
463 assert_se(base64char(63) == '/');
466 static void test_unbase64char(void) {
467 assert_se(unbase64char('A') == 0);
468 assert_se(unbase64char('Z') == 25);
469 assert_se(unbase64char('a') == 26);
470 assert_se(unbase64char('z') == 51);
471 assert_se(unbase64char('0') == 52);
472 assert_se(unbase64char('9') == 61);
473 assert_se(unbase64char('+') == 62);
474 assert_se(unbase64char('/') == 63);
475 assert_se(unbase64char('=') == -EINVAL
);
478 static void test_octchar(void) {
479 assert_se(octchar(00) == '0');
480 assert_se(octchar(07) == '7');
483 static void test_unoctchar(void) {
484 assert_se(unoctchar('0') == 00);
485 assert_se(unoctchar('7') == 07);
488 static void test_decchar(void) {
489 assert_se(decchar(0) == '0');
490 assert_se(decchar(9) == '9');
493 static void test_undecchar(void) {
494 assert_se(undecchar('0') == 0);
495 assert_se(undecchar('9') == 9);
498 static void test_unhexmem(void) {
499 const char *hex
= "efa214921";
500 const char *hex_invalid
= "efa214921o";
501 _cleanup_free_
char *hex2
= NULL
;
502 _cleanup_free_
void *mem
= NULL
;
505 assert_se(unhexmem(hex
, strlen(hex
), &mem
, &len
) == 0);
506 assert_se(unhexmem(hex
, strlen(hex
) + 1, &mem
, &len
) == -EINVAL
);
507 assert_se(unhexmem(hex_invalid
, strlen(hex_invalid
), &mem
, &len
) == -EINVAL
);
509 assert_se((hex2
= hexmem(mem
, len
)));
513 assert_se(memcmp(hex
, hex2
, strlen(hex
)) == 0);
517 assert_se(unhexmem(hex
, strlen(hex
) - 1, &mem
, &len
) == 0);
518 assert_se((hex2
= hexmem(mem
, len
)));
519 assert_se(memcmp(hex
, hex2
, strlen(hex
) - 1) == 0);
522 /* https://tools.ietf.org/html/rfc4648#section-10 */
523 static void test_base32hexmem(void) {
526 b32
= base32hexmem("", strlen(""), true);
528 assert_se(streq(b32
, ""));
531 b32
= base32hexmem("f", strlen("f"), true);
533 assert_se(streq(b32
, "CO======"));
536 b32
= base32hexmem("fo", strlen("fo"), true);
538 assert_se(streq(b32
, "CPNG===="));
541 b32
= base32hexmem("foo", strlen("foo"), true);
543 assert_se(streq(b32
, "CPNMU==="));
546 b32
= base32hexmem("foob", strlen("foob"), true);
548 assert_se(streq(b32
, "CPNMUOG="));
551 b32
= base32hexmem("fooba", strlen("fooba"), true);
553 assert_se(streq(b32
, "CPNMUOJ1"));
556 b32
= base32hexmem("foobar", strlen("foobar"), true);
558 assert_se(streq(b32
, "CPNMUOJ1E8======"));
561 b32
= base32hexmem("", strlen(""), false);
563 assert_se(streq(b32
, ""));
566 b32
= base32hexmem("f", strlen("f"), false);
568 assert_se(streq(b32
, "CO"));
571 b32
= base32hexmem("fo", strlen("fo"), false);
573 assert_se(streq(b32
, "CPNG"));
576 b32
= base32hexmem("foo", strlen("foo"), false);
578 assert_se(streq(b32
, "CPNMU"));
581 b32
= base32hexmem("foob", strlen("foob"), false);
583 assert_se(streq(b32
, "CPNMUOG"));
586 b32
= base32hexmem("fooba", strlen("fooba"), false);
588 assert_se(streq(b32
, "CPNMUOJ1"));
591 b32
= base32hexmem("foobar", strlen("foobar"), false);
593 assert_se(streq(b32
, "CPNMUOJ1E8"));
597 static void test_unbase32hexmem(void) {
601 assert_se(unbase32hexmem("", strlen(""), true, &mem
, &len
) == 0);
602 assert_se(streq(strndupa(mem
, len
), ""));
605 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem
, &len
) == 0);
606 assert_se(streq(strndupa(mem
, len
), "f"));
609 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem
, &len
) == 0);
610 assert_se(streq(strndupa(mem
, len
), "fo"));
613 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem
, &len
) == 0);
614 assert_se(streq(strndupa(mem
, len
), "foo"));
617 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem
, &len
) == 0);
618 assert_se(streq(strndupa(mem
, len
), "foob"));
621 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == 0);
622 assert_se(streq(strndupa(mem
, len
), "fooba"));
625 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem
, &len
) == 0);
626 assert_se(streq(strndupa(mem
, len
), "foobar"));
629 assert_se(unbase32hexmem("A", strlen("A"), true, &mem
, &len
) == -EINVAL
);
630 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem
, &len
) == -EINVAL
);
631 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem
, &len
) == -EINVAL
);
632 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem
, &len
) == -EINVAL
);
633 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem
, &len
) == -EINVAL
);
634 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem
, &len
) == -EINVAL
);
635 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem
, &len
) == -EINVAL
);
636 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem
, &len
) == -EINVAL
);
638 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
639 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
640 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
641 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
642 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
643 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
644 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
645 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
647 assert_se(unbase32hexmem("", strlen(""), false, &mem
, &len
) == 0);
648 assert_se(streq(strndupa(mem
, len
), ""));
651 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem
, &len
) == 0);
652 assert_se(streq(strndupa(mem
, len
), "f"));
655 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem
, &len
) == 0);
656 assert_se(streq(strndupa(mem
, len
), "fo"));
659 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem
, &len
) == 0);
660 assert_se(streq(strndupa(mem
, len
), "foo"));
663 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem
, &len
) == 0);
664 assert_se(streq(strndupa(mem
, len
), "foob"));
667 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem
, &len
) == 0);
668 assert_se(streq(strndupa(mem
, len
), "fooba"));
671 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem
, &len
) == 0);
672 assert_se(streq(strndupa(mem
, len
), "foobar"));
675 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem
, &len
) == -EINVAL
);
676 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem
, &len
) == -EINVAL
);
677 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
678 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
679 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem
, &len
) == -EINVAL
);
680 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem
, &len
) == -EINVAL
);
681 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem
, &len
) == -EINVAL
);
682 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem
, &len
) == -EINVAL
);
683 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem
, &len
) == -EINVAL
);
684 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem
, &len
) == -EINVAL
);
687 /* https://tools.ietf.org/html/rfc4648#section-10 */
688 static void test_base64mem(void) {
691 b64
= base64mem("", strlen(""));
693 assert_se(streq(b64
, ""));
696 b64
= base64mem("f", strlen("f"));
698 assert_se(streq(b64
, "Zg=="));
701 b64
= base64mem("fo", strlen("fo"));
703 assert_se(streq(b64
, "Zm8="));
706 b64
= base64mem("foo", strlen("foo"));
708 assert_se(streq(b64
, "Zm9v"));
711 b64
= base64mem("foob", strlen("foob"));
713 assert_se(streq(b64
, "Zm9vYg=="));
716 b64
= base64mem("fooba", strlen("fooba"));
718 assert_se(streq(b64
, "Zm9vYmE="));
721 b64
= base64mem("foobar", strlen("foobar"));
723 assert_se(streq(b64
, "Zm9vYmFy"));
727 static void test_unbase64mem(void) {
731 assert_se(unbase64mem("", strlen(""), &mem
, &len
) == 0);
732 assert_se(streq(strndupa(mem
, len
), ""));
735 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem
, &len
) == 0);
736 assert_se(streq(strndupa(mem
, len
), "f"));
739 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem
, &len
) == 0);
740 assert_se(streq(strndupa(mem
, len
), "fo"));
743 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem
, &len
) == 0);
744 assert_se(streq(strndupa(mem
, len
), "foo"));
747 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem
, &len
) == 0);
748 assert_se(streq(strndupa(mem
, len
), "foob"));
751 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem
, &len
) == 0);
752 assert_se(streq(strndupa(mem
, len
), "fooba"));
755 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem
, &len
) == 0);
756 assert_se(streq(strndupa(mem
, len
), "foobar"));
759 assert_se(unbase64mem("A", strlen("A"), &mem
, &len
) == -EINVAL
);
760 assert_se(unbase64mem("A====", strlen("A===="), &mem
, &len
) == -EINVAL
);
761 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem
, &len
) == -EINVAL
);
762 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem
, &len
) == -EINVAL
);
765 static void test_cescape(void) {
766 _cleanup_free_
char *escaped
;
768 assert_se(escaped
= cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
769 assert_se(streq(escaped
, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
772 static void test_cunescape(void) {
773 _cleanup_free_
char *unescaped
;
775 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped
) < 0);
776 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX
, &unescaped
) >= 0);
777 assert_se(streq_ptr(unescaped
, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
778 unescaped
= mfree(unescaped
);
780 /* incomplete sequences */
781 assert_se(cunescape("\\x0", 0, &unescaped
) < 0);
782 assert_se(cunescape("\\x0", UNESCAPE_RELAX
, &unescaped
) >= 0);
783 assert_se(streq_ptr(unescaped
, "\\x0"));
784 unescaped
= mfree(unescaped
);
786 assert_se(cunescape("\\x", 0, &unescaped
) < 0);
787 assert_se(cunescape("\\x", UNESCAPE_RELAX
, &unescaped
) >= 0);
788 assert_se(streq_ptr(unescaped
, "\\x"));
789 unescaped
= mfree(unescaped
);
791 assert_se(cunescape("\\", 0, &unescaped
) < 0);
792 assert_se(cunescape("\\", UNESCAPE_RELAX
, &unescaped
) >= 0);
793 assert_se(streq_ptr(unescaped
, "\\"));
794 unescaped
= mfree(unescaped
);
796 assert_se(cunescape("\\11", 0, &unescaped
) < 0);
797 assert_se(cunescape("\\11", UNESCAPE_RELAX
, &unescaped
) >= 0);
798 assert_se(streq_ptr(unescaped
, "\\11"));
799 unescaped
= mfree(unescaped
);
801 assert_se(cunescape("\\1", 0, &unescaped
) < 0);
802 assert_se(cunescape("\\1", UNESCAPE_RELAX
, &unescaped
) >= 0);
803 assert_se(streq_ptr(unescaped
, "\\1"));
804 unescaped
= mfree(unescaped
);
806 assert_se(cunescape("\\u0000", 0, &unescaped
) < 0);
807 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX
, &unescaped
) >= 0);
808 assert_se(streq_ptr(unescaped
, "ßßΠA"));
809 unescaped
= mfree(unescaped
);
811 assert_se(cunescape("\\073", 0, &unescaped
) >= 0);
812 assert_se(streq_ptr(unescaped
, ";"));
815 static void test_foreach_word(void) {
816 const char *word
, *state
;
819 const char test
[] = "test abc d\te f ";
820 const char * const expected
[] = {
830 FOREACH_WORD(word
, l
, test
, state
)
831 assert_se(strneq(expected
[i
++], word
, l
));
834 static void check(const char *test
, char** expected
, bool trailing
) {
835 const char *word
, *state
;
839 printf("<<<%s>>>\n", test
);
840 FOREACH_WORD_QUOTED(word
, l
, test
, state
) {
841 _cleanup_free_
char *t
= NULL
;
843 assert_se(t
= strndup(word
, l
));
844 assert_se(strneq(expected
[i
++], word
, l
));
847 printf("<<<%s>>>\n", state
);
848 assert_se(expected
[i
] == NULL
);
849 assert_se(isempty(state
) == !trailing
);
852 static void test_foreach_word_quoted(void) {
853 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
877 static void test_memdup_multiply(void) {
878 int org
[] = {1, 2, 3};
881 dup
= (int*)memdup_multiply(org
, sizeof(int), 3);
884 assert_se(dup
[0] == 1);
885 assert_se(dup
[1] == 2);
886 assert_se(dup
[2] == 3);
890 static void test_u64log2(void) {
891 assert_se(u64log2(0) == 0);
892 assert_se(u64log2(8) == 3);
893 assert_se(u64log2(9) == 3);
894 assert_se(u64log2(15) == 3);
895 assert_se(u64log2(16) == 4);
896 assert_se(u64log2(1024*1024) == 20);
897 assert_se(u64log2(1024*1024+5) == 20);
900 static void test_protect_errno(void) {
906 assert_se(errno
== 12);
909 static void test_parse_size(void) {
912 assert_se(parse_size("111", 1024, &bytes
) == 0);
913 assert_se(bytes
== 111);
915 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
916 assert_se(bytes
== 111);
918 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
919 assert_se(bytes
== 112);
921 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
922 assert_se(bytes
== 112);
924 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
925 assert_se(bytes
== 3*1024 + 512);
927 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
928 assert_se(bytes
== 3*1024);
930 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
931 assert_se(bytes
== 3*1024);
933 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
935 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
936 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
938 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
940 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
941 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
943 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
944 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
946 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
948 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
949 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
951 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
952 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
954 assert_se(parse_size("12P", 1024, &bytes
) == 0);
955 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
957 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
959 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
960 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
962 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
964 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
966 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
968 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
969 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
970 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
972 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
974 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
977 static void test_parse_cpu_set(void) {
982 /* Simple range (from CPUAffinity example) */
983 ncpus
= parse_cpu_set_and_warn("1 2", &c
, NULL
, "fake", 1, "CPUAffinity");
984 assert_se(ncpus
>= 1024);
985 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus
), c
));
986 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus
), c
));
987 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 2);
990 /* A more interesting range */
991 ncpus
= parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c
, NULL
, "fake", 1, "CPUAffinity");
992 assert_se(ncpus
>= 1024);
993 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 8);
994 for (cpu
= 0; cpu
< 4; cpu
++)
995 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
996 for (cpu
= 8; cpu
< 12; cpu
++)
997 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1000 /* Quoted strings */
1001 ncpus
= parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c
, NULL
, "fake", 1, "CPUAffinity");
1002 assert_se(ncpus
>= 1024);
1003 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 4);
1004 for (cpu
= 8; cpu
< 12; cpu
++)
1005 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1008 /* Use commas as separators */
1009 ncpus
= parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c
, NULL
, "fake", 1, "CPUAffinity");
1010 assert_se(ncpus
< 0);
1014 ncpus
= parse_cpu_set_and_warn("0-3,8-11", &c
, NULL
, "fake", 1, "CPUAffinity");
1015 assert_se(ncpus
< 0);
1019 ncpus
= parse_cpu_set_and_warn("0 1 2 3 garbage", &c
, NULL
, "fake", 1, "CPUAffinity");
1020 assert_se(ncpus
< 0);
1025 ncpus
= parse_cpu_set_and_warn("", &c
, NULL
, "fake", 1, "CPUAffinity");
1026 assert_se(ncpus
== 0); /* empty string returns 0 */
1029 /* Runnaway quoted string */
1030 ncpus
= parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c
, NULL
, "fake", 1, "CPUAffinity");
1031 assert_se(ncpus
< 0);
1035 static void test_config_parse_iec_uint64(void) {
1036 uint64_t offset
= 0;
1037 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset
, NULL
) == 0);
1038 assert_se(offset
== 4 * 1024 * 1024);
1040 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset
, NULL
) == 0);
1043 static void test_strextend(void) {
1044 _cleanup_free_
char *str
= strdup("0123");
1045 strextend(&str
, "456", "78", "9", NULL
);
1046 assert_se(streq(str
, "0123456789"));
1049 static void test_strrep(void) {
1050 _cleanup_free_
char *one
, *three
, *zero
;
1051 one
= strrep("waldo", 1);
1052 three
= strrep("waldo", 3);
1053 zero
= strrep("waldo", 0);
1055 assert_se(streq(one
, "waldo"));
1056 assert_se(streq(three
, "waldowaldowaldo"));
1057 assert_se(streq(zero
, ""));
1060 static void test_split_pair(void) {
1061 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
1063 assert_se(split_pair("", "", &a
, &b
) == -EINVAL
);
1064 assert_se(split_pair("foo=bar", "", &a
, &b
) == -EINVAL
);
1065 assert_se(split_pair("", "=", &a
, &b
) == -EINVAL
);
1066 assert_se(split_pair("foo=bar", "=", &a
, &b
) >= 0);
1067 assert_se(streq(a
, "foo"));
1068 assert_se(streq(b
, "bar"));
1071 assert_se(split_pair("==", "==", &a
, &b
) >= 0);
1072 assert_se(streq(a
, ""));
1073 assert_se(streq(b
, ""));
1077 assert_se(split_pair("===", "==", &a
, &b
) >= 0);
1078 assert_se(streq(a
, ""));
1079 assert_se(streq(b
, "="));
1082 static void test_fstab_node_to_udev_node(void) {
1085 n
= fstab_node_to_udev_node("LABEL=applé/jack");
1087 assert_se(streq(n
, "/dev/disk/by-label/applé\\x2fjack"));
1090 n
= fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1092 assert_se(streq(n
, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1095 n
= fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1097 assert_se(streq(n
, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1100 n
= fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1102 assert_se(streq(n
, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1105 n
= fstab_node_to_udev_node("PONIES=awesome");
1107 assert_se(streq(n
, "PONIES=awesome"));
1110 n
= fstab_node_to_udev_node("/dev/xda1");
1112 assert_se(streq(n
, "/dev/xda1"));
1116 static void test_get_files_in_directory(void) {
1117 _cleanup_strv_free_
char **l
= NULL
, **t
= NULL
;
1119 assert_se(get_files_in_directory("/tmp", &l
) >= 0);
1120 assert_se(get_files_in_directory(".", &t
) >= 0);
1121 assert_se(get_files_in_directory(".", NULL
) >= 0);
1124 static void test_in_set(void) {
1125 assert_se(IN_SET(1, 1));
1126 assert_se(IN_SET(1, 1, 2, 3, 4));
1127 assert_se(IN_SET(2, 1, 2, 3, 4));
1128 assert_se(IN_SET(3, 1, 2, 3, 4));
1129 assert_se(IN_SET(4, 1, 2, 3, 4));
1130 assert_se(!IN_SET(0, 1));
1131 assert_se(!IN_SET(0, 1, 2, 3, 4));
1134 static void test_writing_tmpfile(void) {
1135 char name
[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1136 _cleanup_free_
char *contents
= NULL
;
1139 struct iovec iov
[3];
1141 IOVEC_SET_STRING(iov
[0], "abc\n");
1142 IOVEC_SET_STRING(iov
[1], ALPHANUMERICAL
"\n");
1143 IOVEC_SET_STRING(iov
[2], "");
1145 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1146 printf("tmpfile: %s", name
);
1148 r
= writev(fd
, iov
, 3);
1151 r
= read_full_file(name
, &contents
, &size
);
1153 printf("contents: %s", contents
);
1154 assert_se(streq(contents
, "abc\n" ALPHANUMERICAL
"\n"));
1159 static void test_hexdump(void) {
1163 hexdump(stdout
, NULL
, 0);
1164 hexdump(stdout
, "", 0);
1165 hexdump(stdout
, "", 1);
1166 hexdump(stdout
, "x", 1);
1167 hexdump(stdout
, "x", 2);
1168 hexdump(stdout
, "foobar", 7);
1169 hexdump(stdout
, "f\nobar", 7);
1170 hexdump(stdout
, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1172 for (i
= 0; i
< ELEMENTSOF(data
); i
++)
1175 hexdump(stdout
, data
, sizeof(data
));
1178 static void test_log2i(void) {
1179 assert_se(log2i(1) == 0);
1180 assert_se(log2i(2) == 1);
1181 assert_se(log2i(3) == 1);
1182 assert_se(log2i(4) == 2);
1183 assert_se(log2i(32) == 5);
1184 assert_se(log2i(33) == 5);
1185 assert_se(log2i(63) == 5);
1186 assert_se(log2i(INT_MAX
) == sizeof(int)*8-2);
1189 static void test_foreach_string(void) {
1190 const char * const t
[] = {
1199 FOREACH_STRING(x
, "foo", "bar", "waldo")
1200 assert_se(streq_ptr(t
[i
++], x
));
1204 FOREACH_STRING(x
, "zzz")
1205 assert_se(streq(x
, "zzz"));
1208 static void test_filename_is_valid(void) {
1209 char foo
[FILENAME_MAX
+2];
1212 assert_se(!filename_is_valid(""));
1213 assert_se(!filename_is_valid("/bar/foo"));
1214 assert_se(!filename_is_valid("/"));
1215 assert_se(!filename_is_valid("."));
1216 assert_se(!filename_is_valid(".."));
1218 for (i
=0; i
<FILENAME_MAX
+1; i
++)
1220 foo
[FILENAME_MAX
+1] = '\0';
1222 assert_se(!filename_is_valid(foo
));
1224 assert_se(filename_is_valid("foo_bar-333"));
1225 assert_se(filename_is_valid("o.o"));
1228 static void test_string_has_cc(void) {
1229 assert_se(string_has_cc("abc\1", NULL
));
1230 assert_se(string_has_cc("abc\x7f", NULL
));
1231 assert_se(string_has_cc("abc\x7f", NULL
));
1232 assert_se(string_has_cc("abc\t\x7f", "\t"));
1233 assert_se(string_has_cc("abc\t\x7f", "\t"));
1234 assert_se(string_has_cc("\x7f", "\t"));
1235 assert_se(string_has_cc("\x7f", "\t\a"));
1237 assert_se(!string_has_cc("abc\t\t", "\t"));
1238 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1239 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1242 static void test_ascii_strlower(void) {
1243 char a
[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1244 assert_se(streq(ascii_strlower(a
), "aabbcc jk ii od lkjjj kkd lk"));
1247 static void test_files_same(void) {
1248 _cleanup_close_
int fd
= -1;
1249 char name
[] = "/tmp/test-files_same.XXXXXX";
1250 char name_alias
[] = "/tmp/test-files_same.alias";
1252 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1254 assert_se(symlink(name
, name_alias
) >= 0);
1256 assert_se(files_same(name
, name
));
1257 assert_se(files_same(name
, name_alias
));
1263 static void test_is_valid_documentation_url(void) {
1264 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1265 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1266 assert_se(documentation_url_is_valid("file:/foo/foo"));
1267 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1268 assert_se(documentation_url_is_valid("info:bar"));
1270 assert_se(!documentation_url_is_valid("foo:"));
1271 assert_se(!documentation_url_is_valid("info:"));
1272 assert_se(!documentation_url_is_valid(""));
1275 static void test_file_in_same_dir(void) {
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");
1287 assert_se(streq(t
, "a"));
1290 t
= file_in_same_dir("a/", "a");
1291 assert_se(streq(t
, "a/a"));
1294 t
= file_in_same_dir("bar/foo", "bar");
1295 assert_se(streq(t
, "bar/bar"));
1299 static void test_endswith(void) {
1300 assert_se(endswith("foobar", "bar"));
1301 assert_se(endswith("foobar", ""));
1302 assert_se(endswith("foobar", "foobar"));
1303 assert_se(endswith("", ""));
1305 assert_se(!endswith("foobar", "foo"));
1306 assert_se(!endswith("foobar", "foobarfoofoo"));
1309 static void test_endswith_no_case(void) {
1310 assert_se(endswith_no_case("fooBAR", "bar"));
1311 assert_se(endswith_no_case("foobar", ""));
1312 assert_se(endswith_no_case("foobar", "FOOBAR"));
1313 assert_se(endswith_no_case("", ""));
1315 assert_se(!endswith_no_case("foobar", "FOO"));
1316 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1319 static void test_close_nointr(void) {
1320 char name
[] = "/tmp/test-test-close_nointr.XXXXXX";
1323 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1325 assert_se(close_nointr(fd
) >= 0);
1326 assert_se(close_nointr(fd
) < 0);
1332 static void test_unlink_noerrno(void) {
1333 char name
[] = "/tmp/test-close_nointr.XXXXXX";
1336 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1338 assert_se(close_nointr(fd
) >= 0);
1343 assert_se(unlink_noerrno(name
) >= 0);
1344 assert_se(errno
== -42);
1345 assert_se(unlink_noerrno(name
) < 0);
1346 assert_se(errno
== -42);
1350 static void test_readlink_and_make_absolute(void) {
1351 char tempdir
[] = "/tmp/test-readlink_and_make_absolute";
1352 char name
[] = "/tmp/test-readlink_and_make_absolute/original";
1353 char name2
[] = "test-readlink_and_make_absolute/original";
1354 char name_alias
[] = "/tmp/test-readlink_and_make_absolute-alias";
1357 assert_se(mkdir_safe(tempdir
, 0755, getuid(), getgid()) >= 0);
1358 assert_se(touch(name
) >= 0);
1360 assert_se(symlink(name
, name_alias
) >= 0);
1361 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1362 assert_se(streq(r
, name
));
1364 assert_se(unlink(name_alias
) >= 0);
1366 assert_se(chdir(tempdir
) >= 0);
1367 assert_se(symlink(name2
, name_alias
) >= 0);
1368 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1369 assert_se(streq(r
, name
));
1371 assert_se(unlink(name_alias
) >= 0);
1373 assert_se(rm_rf(tempdir
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
1376 static void test_ignore_signals(void) {
1377 assert_se(ignore_signals(SIGINT
, -1) >= 0);
1378 assert_se(kill(getpid(), SIGINT
) >= 0);
1379 assert_se(ignore_signals(SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1380 assert_se(kill(getpid(), SIGUSR1
) >= 0);
1381 assert_se(kill(getpid(), SIGUSR2
) >= 0);
1382 assert_se(kill(getpid(), SIGTERM
) >= 0);
1383 assert_se(kill(getpid(), SIGPIPE
) >= 0);
1384 assert_se(default_signals(SIGINT
, SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1387 static void test_strshorten(void) {
1388 char s
[] = "foobar";
1390 assert_se(strlen(strshorten(s
, 6)) == 6);
1391 assert_se(strlen(strshorten(s
, 12)) == 6);
1392 assert_se(strlen(strshorten(s
, 2)) == 2);
1393 assert_se(strlen(strshorten(s
, 0)) == 0);
1396 static void test_strjoina(void) {
1399 actual
= strjoina("", "foo", "bar");
1400 assert_se(streq(actual
, "foobar"));
1402 actual
= strjoina("foo", "bar", "baz");
1403 assert_se(streq(actual
, "foobarbaz"));
1405 actual
= strjoina("foo", "", "bar", "baz");
1406 assert_se(streq(actual
, "foobarbaz"));
1408 actual
= strjoina("foo");
1409 assert_se(streq(actual
, "foo"));
1411 actual
= strjoina(NULL
);
1412 assert_se(streq(actual
, ""));
1414 actual
= strjoina(NULL
, "foo");
1415 assert_se(streq(actual
, ""));
1417 actual
= strjoina("foo", NULL
, "bar");
1418 assert_se(streq(actual
, "foo"));
1421 static void test_is_symlink(void) {
1422 char name
[] = "/tmp/test-is_symlink.XXXXXX";
1423 char name_link
[] = "/tmp/test-is_symlink.link";
1424 _cleanup_close_
int fd
= -1;
1426 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1428 assert_se(symlink(name
, name_link
) >= 0);
1430 assert_se(is_symlink(name
) == 0);
1431 assert_se(is_symlink(name_link
) == 1);
1432 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1439 static void test_search_and_fopen(void) {
1440 const char *dirs
[] = {"/tmp/foo/bar", "/tmp", NULL
};
1441 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1446 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1450 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1454 r
= search_and_fopen(name
, "r", NULL
, dirs
, &f
);
1458 r
= search_and_fopen(basename(name
), "r", "/", dirs
, &f
);
1462 r
= search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1464 r
= search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1470 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1475 static void test_search_and_fopen_nulstr(void) {
1476 const char dirs
[] = "/tmp/foo/bar\0/tmp\0";
1477 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1482 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1486 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1490 r
= search_and_fopen_nulstr(name
, "r", NULL
, dirs
, &f
);
1494 r
= search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1496 r
= search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1502 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1506 static void test_glob_exists(void) {
1507 char name
[] = "/tmp/test-glob_exists.XXXXXX";
1511 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1515 r
= glob_exists("/tmp/test-glob_exists*");
1520 r
= glob_exists("/tmp/test-glob_exists*");
1524 static void test_execute_directory(void) {
1525 char template_lo
[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1526 char template_hi
[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1527 const char * dirs
[] = {template_hi
, template_lo
, NULL
};
1528 const char *name
, *name2
, *name3
, *overridden
, *override
, *masked
, *mask
;
1530 assert_se(mkdtemp(template_lo
));
1531 assert_se(mkdtemp(template_hi
));
1533 name
= strjoina(template_lo
, "/script");
1534 name2
= strjoina(template_hi
, "/script2");
1535 name3
= strjoina(template_lo
, "/useless");
1536 overridden
= strjoina(template_lo
, "/overridden");
1537 override
= strjoina(template_hi
, "/overridden");
1538 masked
= strjoina(template_lo
, "/masked");
1539 mask
= strjoina(template_hi
, "/masked");
1541 assert_se(write_string_file(name
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE
) == 0);
1542 assert_se(write_string_file(name2
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE
) == 0);
1543 assert_se(write_string_file(overridden
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1544 assert_se(write_string_file(override
, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE
) == 0);
1545 assert_se(write_string_file(masked
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1546 assert_se(symlink("/dev/null", mask
) == 0);
1547 assert_se(chmod(name
, 0755) == 0);
1548 assert_se(chmod(name2
, 0755) == 0);
1549 assert_se(chmod(overridden
, 0755) == 0);
1550 assert_se(chmod(override
, 0755) == 0);
1551 assert_se(chmod(masked
, 0755) == 0);
1552 assert_se(touch(name3
) >= 0);
1554 execute_directories(dirs
, DEFAULT_TIMEOUT_USEC
, NULL
);
1556 assert_se(chdir(template_lo
) == 0);
1557 assert_se(access("it_works", F_OK
) >= 0);
1558 assert_se(access("failed", F_OK
) < 0);
1560 assert_se(chdir(template_hi
) == 0);
1561 assert_se(access("it_works2", F_OK
) >= 0);
1562 assert_se(access("failed", F_OK
) < 0);
1564 (void) rm_rf(template_lo
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1565 (void) rm_rf(template_hi
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1568 static void test_extract_first_word(void) {
1569 const char *p
, *original
;
1572 p
= original
= "foobar waldo";
1573 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1574 assert_se(streq(t
, "foobar"));
1576 assert_se(p
== original
+ 7);
1578 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1579 assert_se(streq(t
, "waldo"));
1581 assert_se(isempty(p
));
1583 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1585 assert_se(isempty(p
));
1587 p
= original
= "\"foobar\" \'waldo\'";
1588 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1589 assert_se(streq(t
, "\"foobar\""));
1591 assert_se(p
== original
+ 9);
1593 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1594 assert_se(streq(t
, "\'waldo\'"));
1596 assert_se(isempty(p
));
1598 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1600 assert_se(isempty(p
));
1602 p
= original
= "\"foobar\" \'waldo\'";
1603 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1604 assert_se(streq(t
, "foobar"));
1606 assert_se(p
== original
+ 9);
1608 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1609 assert_se(streq(t
, "waldo"));
1611 assert_se(isempty(p
));
1613 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1615 assert_se(isempty(p
));
1617 p
= original
= "\"";
1618 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1619 assert_se(streq(t
, "\""));
1621 assert_se(isempty(p
));
1623 p
= original
= "\"";
1624 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1625 assert_se(p
== original
+ 1);
1627 p
= original
= "\'";
1628 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1629 assert_se(streq(t
, "\'"));
1631 assert_se(isempty(p
));
1633 p
= original
= "\'";
1634 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1635 assert_se(p
== original
+ 1);
1637 p
= original
= "\'fooo";
1638 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1639 assert_se(streq(t
, "\'fooo"));
1641 assert_se(isempty(p
));
1643 p
= original
= "\'fooo";
1644 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1645 assert_se(p
== original
+ 5);
1647 p
= original
= "\'fooo";
1648 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1649 assert_se(streq(t
, "fooo"));
1651 assert_se(isempty(p
));
1653 p
= original
= "\"fooo";
1654 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1655 assert_se(streq(t
, "fooo"));
1657 assert_se(isempty(p
));
1659 p
= original
= "yay\'foo\'bar";
1660 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1661 assert_se(streq(t
, "yay\'foo\'bar"));
1663 assert_se(isempty(p
));
1665 p
= original
= "yay\'foo\'bar";
1666 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1667 assert_se(streq(t
, "yayfoobar"));
1669 assert_se(isempty(p
));
1671 p
= original
= " foobar ";
1672 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1673 assert_se(streq(t
, "foobar"));
1675 assert_se(isempty(p
));
1677 p
= original
= " foo\\ba\\x6ar ";
1678 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1679 assert_se(streq(t
, "foo\ba\x6ar"));
1681 assert_se(isempty(p
));
1683 p
= original
= " foo\\ba\\x6ar ";
1684 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1685 assert_se(streq(t
, "foobax6ar"));
1687 assert_se(isempty(p
));
1689 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1690 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1691 assert_se(streq(t
, "föo"));
1693 assert_se(p
== original
+ 13);
1695 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
) > 0);
1696 assert_se(streq(t
, "pi\360\237\222\251le"));
1698 assert_se(isempty(p
));
1700 p
= original
= "fooo\\";
1701 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1702 assert_se(streq(t
, "fooo"));
1704 assert_se(isempty(p
));
1706 p
= original
= "fooo\\";
1707 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1708 assert_se(streq(t
, "fooo\\"));
1710 assert_se(isempty(p
));
1712 p
= original
= "fooo\\";
1713 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1714 assert_se(streq(t
, "fooo\\"));
1716 assert_se(isempty(p
));
1718 p
= original
= "fooo\\";
1719 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1720 assert_se(streq(t
, "fooo\\"));
1722 assert_se(isempty(p
));
1724 p
= original
= "\"foo\\";
1725 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == -EINVAL
);
1726 assert_se(p
== original
+ 5);
1728 p
= original
= "\"foo\\";
1729 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1730 assert_se(streq(t
, "foo"));
1732 assert_se(isempty(p
));
1734 p
= original
= "foo::bar";
1735 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1736 assert_se(streq(t
, "foo"));
1738 assert_se(p
== original
+ 5);
1740 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1741 assert_se(streq(t
, "bar"));
1743 assert_se(isempty(p
));
1745 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1747 assert_se(isempty(p
));
1749 p
= original
= "foo\\:bar::waldo";
1750 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1751 assert_se(streq(t
, "foo:bar"));
1753 assert_se(p
== original
+ 10);
1755 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1756 assert_se(streq(t
, "waldo"));
1758 assert_se(isempty(p
));
1760 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1762 assert_se(isempty(p
));
1764 p
= original
= "\"foo\\";
1765 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
) == -EINVAL
);
1766 assert_se(p
== original
+ 5);
1768 p
= original
= "\"foo\\";
1769 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1770 assert_se(streq(t
, "foo\\"));
1772 assert_se(isempty(p
));
1774 p
= original
= "\"foo\\";
1775 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1776 assert_se(streq(t
, "foo\\"));
1778 assert_se(isempty(p
));
1780 p
= original
= "fooo\\ bar quux";
1781 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1782 assert_se(streq(t
, "fooo bar"));
1784 assert_se(p
== original
+ 10);
1786 p
= original
= "fooo\\ bar quux";
1787 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1788 assert_se(streq(t
, "fooo bar"));
1790 assert_se(p
== original
+ 10);
1792 p
= original
= "fooo\\ bar quux";
1793 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1794 assert_se(streq(t
, "fooo bar"));
1796 assert_se(p
== original
+ 10);
1798 p
= original
= "fooo\\ bar quux";
1799 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1800 assert_se(p
== original
+ 5);
1802 p
= original
= "fooo\\ bar quux";
1803 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1804 assert_se(streq(t
, "fooo\\ bar"));
1806 assert_se(p
== original
+ 10);
1808 p
= original
= "\\w+@\\K[\\d.]+";
1809 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1810 assert_se(p
== original
+ 1);
1812 p
= original
= "\\w+@\\K[\\d.]+";
1813 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1814 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1816 assert_se(isempty(p
));
1818 p
= original
= "\\w+\\b";
1819 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1820 assert_se(streq(t
, "\\w+\b"));
1822 assert_se(isempty(p
));
1824 p
= original
= "-N ''";
1825 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1826 assert_se(streq(t
, "-N"));
1828 assert_se(p
== original
+ 3);
1830 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1831 assert_se(streq(t
, ""));
1833 assert_se(isempty(p
));
1835 p
= original
= ":foo\\:bar::waldo:";
1836 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1838 assert_se(streq(t
, ""));
1840 assert_se(p
== original
+ 1);
1842 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1843 assert_se(streq(t
, "foo:bar"));
1845 assert_se(p
== original
+ 10);
1847 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1849 assert_se(streq(t
, ""));
1851 assert_se(p
== original
+ 11);
1853 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1854 assert_se(streq(t
, "waldo"));
1856 assert_se(p
== original
+ 17);
1858 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1859 assert_se(streq(t
, ""));
1861 assert_se(p
== NULL
);
1863 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 0);
1868 static void test_extract_first_word_and_warn(void) {
1869 const char *p
, *original
;
1872 p
= original
= "foobar waldo";
1873 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1874 assert_se(streq(t
, "foobar"));
1876 assert_se(p
== original
+ 7);
1878 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1879 assert_se(streq(t
, "waldo"));
1881 assert_se(isempty(p
));
1883 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1885 assert_se(isempty(p
));
1887 p
= original
= "\"foobar\" \'waldo\'";
1888 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1889 assert_se(streq(t
, "foobar"));
1891 assert_se(p
== original
+ 9);
1893 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1894 assert_se(streq(t
, "waldo"));
1896 assert_se(isempty(p
));
1898 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1900 assert_se(isempty(p
));
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
= "\'";
1907 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1908 assert_se(p
== original
+ 1);
1910 p
= original
= "\'fooo";
1911 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1912 assert_se(p
== original
+ 5);
1914 p
= original
= "\'fooo";
1915 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1916 assert_se(streq(t
, "fooo"));
1918 assert_se(isempty(p
));
1920 p
= original
= " foo\\ba\\x6ar ";
1921 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1922 assert_se(streq(t
, "foo\ba\x6ar"));
1924 assert_se(isempty(p
));
1926 p
= original
= " foo\\ba\\x6ar ";
1927 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1928 assert_se(streq(t
, "foobax6ar"));
1930 assert_se(isempty(p
));
1932 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1933 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1934 assert_se(streq(t
, "föo"));
1936 assert_se(p
== original
+ 13);
1938 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1939 assert_se(streq(t
, "pi\360\237\222\251le"));
1941 assert_se(isempty(p
));
1943 p
= original
= "fooo\\";
1944 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1945 assert_se(streq(t
, "fooo"));
1947 assert_se(isempty(p
));
1949 p
= original
= "fooo\\";
1950 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1951 assert_se(streq(t
, "fooo\\"));
1953 assert_se(isempty(p
));
1955 p
= original
= "fooo\\";
1956 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1957 assert_se(streq(t
, "fooo\\"));
1959 assert_se(isempty(p
));
1961 p
= original
= "\"foo\\";
1962 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1963 assert_se(p
== original
+ 5);
1965 p
= original
= "\"foo\\";
1966 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1967 assert_se(streq(t
, "foo"));
1969 assert_se(isempty(p
));
1971 p
= original
= "\"foo\\";
1972 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) == -EINVAL
);
1973 assert_se(p
== original
+ 5);
1975 p
= original
= "\"foo\\";
1976 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1977 assert_se(streq(t
, "foo"));
1979 assert_se(isempty(p
));
1981 p
= original
= "fooo\\ bar quux";
1982 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1983 assert_se(streq(t
, "fooo bar"));
1985 assert_se(p
== original
+ 10);
1987 p
= original
= "fooo\\ bar quux";
1988 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1989 assert_se(streq(t
, "fooo bar"));
1991 assert_se(p
== original
+ 10);
1993 p
= original
= "fooo\\ bar quux";
1994 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1995 assert_se(streq(t
, "fooo\\ bar"));
1997 assert_se(p
== original
+ 10);
1999 p
= original
= "\\w+@\\K[\\d.]+";
2000 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
2001 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
2003 assert_se(isempty(p
));
2005 p
= original
= "\\w+\\b";
2006 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
2007 assert_se(streq(t
, "\\w+\b"));
2009 assert_se(isempty(p
));
2012 static void test_extract_many_words(void) {
2013 const char *p
, *original
;
2016 p
= original
= "foobar waldi piep";
2017 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 3);
2018 assert_se(isempty(p
));
2019 assert_se(streq_ptr(a
, "foobar"));
2020 assert_se(streq_ptr(b
, "waldi"));
2021 assert_se(streq_ptr(c
, "piep"));
2026 p
= original
= "'foobar' wa\"ld\"i ";
2027 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 2);
2028 assert_se(isempty(p
));
2029 assert_se(streq_ptr(a
, "'foobar'"));
2030 assert_se(streq_ptr(b
, "wa\"ld\"i"));
2031 assert_se(streq_ptr(c
, NULL
));
2035 p
= original
= "'foobar' wa\"ld\"i ";
2036 assert_se(extract_many_words(&p
, NULL
, EXTRACT_QUOTES
, &a
, &b
, &c
, NULL
) == 2);
2037 assert_se(isempty(p
));
2038 assert_se(streq_ptr(a
, "foobar"));
2039 assert_se(streq_ptr(b
, "waldi"));
2040 assert_se(streq_ptr(c
, NULL
));
2045 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2046 assert_se(isempty(p
));
2047 assert_se(streq_ptr(a
, NULL
));
2048 assert_se(streq_ptr(b
, NULL
));
2049 assert_se(streq_ptr(c
, NULL
));
2052 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2053 assert_se(isempty(p
));
2054 assert_se(streq_ptr(a
, NULL
));
2055 assert_se(streq_ptr(b
, NULL
));
2056 assert_se(streq_ptr(c
, NULL
));
2058 p
= original
= "foobar";
2059 assert_se(extract_many_words(&p
, NULL
, 0, NULL
) == 0);
2060 assert_se(p
== original
);
2062 p
= original
= "foobar waldi";
2063 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2064 assert_se(p
== original
+7);
2065 assert_se(streq_ptr(a
, "foobar"));
2068 p
= original
= " foobar ";
2069 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2070 assert_se(isempty(p
));
2071 assert_se(streq_ptr(a
, "foobar"));
2075 static int parse_item(const char *key
, const char *value
) {
2078 log_info("kernel cmdline option <%s> = <%s>", key
, strna(value
));
2082 static void test_parse_proc_cmdline(void) {
2083 assert_se(parse_proc_cmdline(parse_item
) >= 0);
2086 static void test_raw_clone(void) {
2087 pid_t parent
, pid
, pid2
;
2090 log_info("before clone: getpid()→"PID_FMT
, parent
);
2091 assert_se(raw_getpid() == parent
);
2093 pid
= raw_clone(0, NULL
);
2094 assert_se(pid
>= 0);
2096 pid2
= raw_getpid();
2097 log_info("raw_clone: "PID_FMT
" getpid()→"PID_FMT
" raw_getpid()→"PID_FMT
,
2098 pid
, getpid(), pid2
);
2100 assert_se(pid2
!= parent
);
2101 _exit(EXIT_SUCCESS
);
2105 assert_se(pid2
== parent
);
2106 waitpid(pid
, &status
, __WCLONE
);
2107 assert_se(WIFEXITED(status
) && WEXITSTATUS(status
) == EXIT_SUCCESS
);
2111 static void test_same_fd(void) {
2112 _cleanup_close_pair_
int p
[2] = { -1, -1 };
2113 _cleanup_close_
int a
= -1, b
= -1, c
= -1;
2115 assert_se(pipe2(p
, O_CLOEXEC
) >= 0);
2116 assert_se((a
= dup(p
[0])) >= 0);
2117 assert_se((b
= open("/dev/null", O_RDONLY
|O_CLOEXEC
)) >= 0);
2118 assert_se((c
= dup(a
)) >= 0);
2120 assert_se(same_fd(p
[0], p
[0]) > 0);
2121 assert_se(same_fd(p
[1], p
[1]) > 0);
2122 assert_se(same_fd(a
, a
) > 0);
2123 assert_se(same_fd(b
, b
) > 0);
2125 assert_se(same_fd(a
, p
[0]) > 0);
2126 assert_se(same_fd(p
[0], a
) > 0);
2127 assert_se(same_fd(c
, p
[0]) > 0);
2128 assert_se(same_fd(p
[0], c
) > 0);
2129 assert_se(same_fd(a
, c
) > 0);
2130 assert_se(same_fd(c
, a
) > 0);
2132 assert_se(same_fd(p
[0], p
[1]) == 0);
2133 assert_se(same_fd(p
[1], p
[0]) == 0);
2134 assert_se(same_fd(p
[0], b
) == 0);
2135 assert_se(same_fd(b
, p
[0]) == 0);
2136 assert_se(same_fd(p
[1], a
) == 0);
2137 assert_se(same_fd(a
, p
[1]) == 0);
2138 assert_se(same_fd(p
[1], b
) == 0);
2139 assert_se(same_fd(b
, p
[1]) == 0);
2141 assert_se(same_fd(a
, b
) == 0);
2142 assert_se(same_fd(b
, a
) == 0);
2145 static void test_uid_ptr(void) {
2147 assert_se(UID_TO_PTR(0) != NULL
);
2148 assert_se(UID_TO_PTR(1000) != NULL
);
2150 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2151 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2154 static void test_sparse_write_one(int fd
, const char *buffer
, size_t n
) {
2157 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2158 assert_se(ftruncate(fd
, 0) >= 0);
2159 assert_se(sparse_write(fd
, buffer
, n
, 4) == (ssize_t
) n
);
2161 assert_se(lseek(fd
, 0, SEEK_CUR
) == (off_t
) n
);
2162 assert_se(ftruncate(fd
, n
) >= 0);
2164 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2165 assert_se(read(fd
, check
, n
) == (ssize_t
) n
);
2167 assert_se(memcmp(buffer
, check
, n
) == 0);
2170 static void test_sparse_write(void) {
2171 const char test_a
[] = "test";
2172 const char test_b
[] = "\0\0\0\0test\0\0\0\0";
2173 const char test_c
[] = "\0\0test\0\0\0\0";
2174 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";
2175 const char test_e
[] = "test\0\0\0\0test";
2176 _cleanup_close_
int fd
= -1;
2177 char fn
[] = "/tmp/sparseXXXXXX";
2179 fd
= mkostemp(fn
, O_CLOEXEC
);
2183 test_sparse_write_one(fd
, test_a
, sizeof(test_a
));
2184 test_sparse_write_one(fd
, test_b
, sizeof(test_b
));
2185 test_sparse_write_one(fd
, test_c
, sizeof(test_c
));
2186 test_sparse_write_one(fd
, test_d
, sizeof(test_d
));
2187 test_sparse_write_one(fd
, test_e
, sizeof(test_e
));
2190 static void test_shell_escape_one(const char *s
, const char *bad
, const char *expected
) {
2191 _cleanup_free_
char *r
;
2193 assert_se(r
= shell_escape(s
, bad
));
2194 assert_se(streq_ptr(r
, expected
));
2197 static void test_shell_escape(void) {
2198 test_shell_escape_one("", "", "");
2199 test_shell_escape_one("\\", "", "\\\\");
2200 test_shell_escape_one("foobar", "", "foobar");
2201 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2202 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2205 static void test_shell_maybe_quote_one(const char *s
, const char *expected
) {
2206 _cleanup_free_
char *r
;
2208 assert_se(r
= shell_maybe_quote(s
));
2209 assert_se(streq(r
, expected
));
2212 static void test_shell_maybe_quote(void) {
2214 test_shell_maybe_quote_one("", "");
2215 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2216 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2217 test_shell_maybe_quote_one("foobar", "foobar");
2218 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2219 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2220 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2223 static void test_parse_mode(void) {
2226 assert_se(parse_mode("-1", &m
) < 0);
2227 assert_se(parse_mode("", &m
) < 0);
2228 assert_se(parse_mode("888", &m
) < 0);
2229 assert_se(parse_mode("77777", &m
) < 0);
2231 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
2232 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
2233 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
2234 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
2237 static void test_tempfn(void) {
2238 char *ret
= NULL
, *p
;
2240 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL
, &ret
) >= 0);
2241 assert_se(streq_ptr(ret
, "/foo/bar/.#waldoXXXXXX"));
2244 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret
) >= 0);
2245 assert_se(streq_ptr(ret
, "/foo/bar/.#[miau]waldoXXXXXX"));
2248 assert_se(tempfn_random("/foo/bar/waldo", NULL
, &ret
) >= 0);
2249 assert_se(p
= startswith(ret
, "/foo/bar/.#waldo"));
2250 assert_se(strlen(p
) == 16);
2251 assert_se(in_charset(p
, "0123456789abcdef"));
2254 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret
) >= 0);
2255 assert_se(p
= startswith(ret
, "/foo/bar/.#[wuff]waldo"));
2256 assert_se(strlen(p
) == 16);
2257 assert_se(in_charset(p
, "0123456789abcdef"));
2260 assert_se(tempfn_random_child("/foo/bar/waldo", NULL
, &ret
) >= 0);
2261 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#"));
2262 assert_se(strlen(p
) == 16);
2263 assert_se(in_charset(p
, "0123456789abcdef"));
2266 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret
) >= 0);
2267 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#[kikiriki]"));
2268 assert_se(strlen(p
) == 16);
2269 assert_se(in_charset(p
, "0123456789abcdef"));
2273 static void test_strcmp_ptr(void) {
2274 assert_se(strcmp_ptr(NULL
, NULL
) == 0);
2275 assert_se(strcmp_ptr("", NULL
) > 0);
2276 assert_se(strcmp_ptr("foo", NULL
) > 0);
2277 assert_se(strcmp_ptr(NULL
, "") < 0);
2278 assert_se(strcmp_ptr(NULL
, "bar") < 0);
2279 assert_se(strcmp_ptr("foo", "bar") > 0);
2280 assert_se(strcmp_ptr("bar", "baz") < 0);
2281 assert_se(strcmp_ptr("foo", "foo") == 0);
2282 assert_se(strcmp_ptr("", "") == 0);
2285 static void test_fgetxattrat_fake(void) {
2286 char t
[] = "/var/tmp/xattrtestXXXXXX";
2287 _cleanup_close_
int fd
= -1;
2292 assert_se(mkdtemp(t
));
2293 x
= strjoina(t
, "/test");
2294 assert_se(touch(x
) >= 0);
2296 r
= setxattr(x
, "user.foo", "bar", 3, 0);
2297 if (r
< 0 && errno
== EOPNOTSUPP
) /* no xattrs supported on /var/tmp... */
2301 fd
= open(t
, O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2304 assert_se(fgetxattrat_fake(fd
, "test", "user.foo", v
, 3, 0) >= 0);
2305 assert_se(memcmp(v
, "bar", 3) == 0);
2308 fd
= open("/", O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2310 assert_se(fgetxattrat_fake(fd
, "usr", "user.idontexist", v
, 3, 0) == -ENODATA
);
2313 assert_se(unlink(x
) >= 0);
2314 assert_se(rmdir(t
) >= 0);
2317 int main(int argc
, char *argv
[]) {
2318 log_parse_environment();
2322 test_align_power2();
2324 test_container_of();
2326 test_div_round_up();
2329 test_parse_boolean();
2338 test_delete_chars();
2342 test_base32hexchar();
2343 test_unbase32hexchar();
2345 test_unbase64char();
2351 test_base32hexmem();
2352 test_unbase32hexmem();
2357 test_foreach_word();
2358 test_foreach_word_quoted();
2359 test_memdup_multiply();
2361 test_protect_errno();
2363 test_parse_cpu_set();
2364 test_config_parse_iec_uint64();
2368 test_fstab_node_to_udev_node();
2369 test_get_files_in_directory();
2371 test_writing_tmpfile();
2374 test_foreach_string();
2375 test_filename_is_valid();
2376 test_string_has_cc();
2377 test_ascii_strlower();
2379 test_is_valid_documentation_url();
2380 test_file_in_same_dir();
2382 test_endswith_no_case();
2383 test_close_nointr();
2384 test_unlink_noerrno();
2385 test_readlink_and_make_absolute();
2386 test_ignore_signals();
2390 test_search_and_fopen();
2391 test_search_and_fopen_nulstr();
2393 test_execute_directory();
2394 test_extract_first_word();
2395 test_extract_first_word_and_warn();
2396 test_extract_many_words();
2397 test_parse_proc_cmdline();
2401 test_sparse_write();
2402 test_shell_escape();
2403 test_shell_maybe_quote();
2407 test_fgetxattrat_fake();