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 "glob-util.h"
43 #include "hexdecoct.h"
46 #include "parse-util.h"
47 #include "path-util.h"
48 #include "proc-cmdline.h"
49 #include "process-util.h"
51 #include "signal-util.h"
52 #include "stat-util.h"
53 #include "string-util.h"
55 #include "user-util.h"
59 #include "xattr-util.h"
61 static void test_streq_ptr(void) {
62 assert_se(streq_ptr(NULL
, NULL
));
63 assert_se(!streq_ptr("abc", "cdef"));
66 static void test_align_power2(void) {
69 assert_se(ALIGN_POWER2(0) == 0);
70 assert_se(ALIGN_POWER2(1) == 1);
71 assert_se(ALIGN_POWER2(2) == 2);
72 assert_se(ALIGN_POWER2(3) == 4);
73 assert_se(ALIGN_POWER2(12) == 16);
75 assert_se(ALIGN_POWER2(ULONG_MAX
) == 0);
76 assert_se(ALIGN_POWER2(ULONG_MAX
- 1) == 0);
77 assert_se(ALIGN_POWER2(ULONG_MAX
- 1024) == 0);
78 assert_se(ALIGN_POWER2(ULONG_MAX
/ 2) == ULONG_MAX
/ 2 + 1);
79 assert_se(ALIGN_POWER2(ULONG_MAX
+ 1) == 0);
81 for (i
= 1; i
< 131071; ++i
) {
82 for (p2
= 1; p2
< i
; p2
<<= 1)
85 assert_se(ALIGN_POWER2(i
) == p2
);
88 for (i
= ULONG_MAX
- 1024; i
< ULONG_MAX
; ++i
) {
89 for (p2
= 1; p2
&& p2
< i
; p2
<<= 1)
92 assert_se(ALIGN_POWER2(i
) == p2
);
96 static void test_max(void) {
99 int b
[CONST_MAX(10, 100)];
101 .a
= CONST_MAX(10, 100),
105 assert_cc(sizeof(val1
.b
) == sizeof(int) * 100);
107 /* CONST_MAX returns (void) instead of a value if the passed arguments
108 * are not of the same type or not constant expressions. */
109 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
110 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
112 assert_se(val1
.a
== 100);
113 assert_se(MAX(++d
, 0) == 1);
116 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
117 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
118 assert_cc(MAXSIZE(char, long) == sizeof(long));
120 assert_se(MAX(-5, 5) == 5);
121 assert_se(MAX(5, 5) == 5);
122 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
123 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
124 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
125 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
126 assert_se(LESS_BY(8, 4) == 4);
127 assert_se(LESS_BY(8, 8) == 0);
128 assert_se(LESS_BY(4, 8) == 0);
129 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
130 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
131 assert_se(CLAMP(-5, 0, 1) == 0);
132 assert_se(CLAMP(5, 0, 1) == 1);
133 assert_se(CLAMP(5, -10, 1) == 1);
134 assert_se(CLAMP(5, -10, 10) == 5);
135 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
138 static void test_container_of(void) {
144 } _packed_ myval
= { };
146 assert_cc(sizeof(myval
) == 17);
147 assert_se(container_of(&myval
.v1
, struct mytype
, v1
) == &myval
);
148 assert_se(container_of(&myval
.v2
, struct mytype
, v2
) == &myval
);
149 assert_se(container_of(&container_of(&myval
.v2
,
156 static void test_alloca(void) {
157 static const uint8_t zero
[997] = { };
160 t
= alloca_align(17, 512);
161 assert_se(!((uintptr_t)t
& 0xff));
164 t
= alloca0_align(997, 1024);
165 assert_se(!((uintptr_t)t
& 0x1ff));
166 assert_se(!memcmp(t
, zero
, 997));
169 static void test_div_round_up(void) {
173 assert_se(DIV_ROUND_UP(0, 8) == 0);
174 assert_se(DIV_ROUND_UP(1, 8) == 1);
175 assert_se(DIV_ROUND_UP(8, 8) == 1);
176 assert_se(DIV_ROUND_UP(12, 8) == 2);
177 assert_se(DIV_ROUND_UP(16, 8) == 2);
179 /* test multiple evaluation */
181 assert_se(DIV_ROUND_UP(div
++, 8) == 0 && div
== 1);
182 assert_se(DIV_ROUND_UP(++div
, 8) == 1 && div
== 2);
183 assert_se(DIV_ROUND_UP(8, div
++) == 4 && div
== 3);
184 assert_se(DIV_ROUND_UP(8, ++div
) == 2 && div
== 4);
186 /* overflow test with exact division */
187 assert_se(sizeof(0U) == 4);
188 assert_se(0xfffffffaU
% 10U == 0U);
189 assert_se(0xfffffffaU
/ 10U == 429496729U);
190 assert_se(DIV_ROUND_UP(0xfffffffaU
, 10U) == 429496729U);
191 assert_se((0xfffffffaU
+ 10U - 1U) / 10U == 0U);
192 assert_se(0xfffffffaU
/ 10U + !!(0xfffffffaU
% 10U) == 429496729U);
194 /* overflow test with rounded division */
195 assert_se(0xfffffffdU
% 10U == 3U);
196 assert_se(0xfffffffdU
/ 10U == 429496729U);
197 assert_se(DIV_ROUND_UP(0xfffffffdU
, 10U) == 429496730U);
198 assert_se((0xfffffffdU
+ 10U - 1U) / 10U == 0U);
199 assert_se(0xfffffffdU
/ 10U + !!(0xfffffffdU
% 10U) == 429496730U);
202 static void test_first_word(void) {
203 assert_se(first_word("Hello", ""));
204 assert_se(first_word("Hello", "Hello"));
205 assert_se(first_word("Hello world", "Hello"));
206 assert_se(first_word("Hello\tworld", "Hello"));
207 assert_se(first_word("Hello\nworld", "Hello"));
208 assert_se(first_word("Hello\rworld", "Hello"));
209 assert_se(first_word("Hello ", "Hello"));
211 assert_se(!first_word("Hello", "Hellooo"));
212 assert_se(!first_word("Hello", "xxxxx"));
213 assert_se(!first_word("Hellooo", "Hello"));
216 static void test_close_many(void) {
218 char name0
[] = "/tmp/test-close-many.XXXXXX";
219 char name1
[] = "/tmp/test-close-many.XXXXXX";
220 char name2
[] = "/tmp/test-close-many.XXXXXX";
222 fds
[0] = mkostemp_safe(name0
, O_RDWR
|O_CLOEXEC
);
223 fds
[1] = mkostemp_safe(name1
, O_RDWR
|O_CLOEXEC
);
224 fds
[2] = mkostemp_safe(name2
, O_RDWR
|O_CLOEXEC
);
228 assert_se(fcntl(fds
[0], F_GETFD
) == -1);
229 assert_se(fcntl(fds
[1], F_GETFD
) == -1);
230 assert_se(fcntl(fds
[2], F_GETFD
) >= 0);
239 static void test_parse_boolean(void) {
240 assert_se(parse_boolean("1") == 1);
241 assert_se(parse_boolean("y") == 1);
242 assert_se(parse_boolean("Y") == 1);
243 assert_se(parse_boolean("yes") == 1);
244 assert_se(parse_boolean("YES") == 1);
245 assert_se(parse_boolean("true") == 1);
246 assert_se(parse_boolean("TRUE") == 1);
247 assert_se(parse_boolean("on") == 1);
248 assert_se(parse_boolean("ON") == 1);
250 assert_se(parse_boolean("0") == 0);
251 assert_se(parse_boolean("n") == 0);
252 assert_se(parse_boolean("N") == 0);
253 assert_se(parse_boolean("no") == 0);
254 assert_se(parse_boolean("NO") == 0);
255 assert_se(parse_boolean("false") == 0);
256 assert_se(parse_boolean("FALSE") == 0);
257 assert_se(parse_boolean("off") == 0);
258 assert_se(parse_boolean("OFF") == 0);
260 assert_se(parse_boolean("garbage") < 0);
261 assert_se(parse_boolean("") < 0);
262 assert_se(parse_boolean("full") < 0);
265 static void test_parse_pid(void) {
269 r
= parse_pid("100", &pid
);
271 assert_se(pid
== 100);
273 r
= parse_pid("0x7FFFFFFF", &pid
);
275 assert_se(pid
== 2147483647);
277 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
278 r
= parse_pid("0", &pid
);
279 assert_se(r
== -ERANGE
);
280 assert_se(pid
== 65);
282 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
283 r
= parse_pid("-100", &pid
);
284 assert_se(r
== -ERANGE
);
285 assert_se(pid
== 65);
287 pid
= 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
288 r
= parse_pid("0xFFFFFFFFFFFFFFFFF", &pid
);
289 assert_se(r
== -ERANGE
);
290 assert_se(pid
== 65);
292 r
= parse_pid("junk", &pid
);
293 assert_se(r
== -EINVAL
);
296 static void test_parse_uid(void) {
300 r
= parse_uid("100", &uid
);
302 assert_se(uid
== 100);
304 r
= parse_uid("65535", &uid
);
305 assert_se(r
== -ENXIO
);
307 r
= parse_uid("asdsdas", &uid
);
308 assert_se(r
== -EINVAL
);
311 static void test_safe_atou16(void) {
315 r
= safe_atou16("12345", &l
);
317 assert_se(l
== 12345);
319 r
= safe_atou16("123456", &l
);
320 assert_se(r
== -ERANGE
);
322 r
= safe_atou16("junk", &l
);
323 assert_se(r
== -EINVAL
);
326 static void test_safe_atoi16(void) {
330 r
= safe_atoi16("-12345", &l
);
332 assert_se(l
== -12345);
334 r
= safe_atoi16("36536", &l
);
335 assert_se(r
== -ERANGE
);
337 r
= safe_atoi16("junk", &l
);
338 assert_se(r
== -EINVAL
);
341 static void test_safe_atolli(void) {
345 r
= safe_atolli("12345", &l
);
347 assert_se(l
== 12345);
349 r
= safe_atolli("junk", &l
);
350 assert_se(r
== -EINVAL
);
353 static void test_safe_atod(void) {
358 r
= safe_atod("junk", &d
);
359 assert_se(r
== -EINVAL
);
361 r
= safe_atod("0.2244", &d
);
363 assert_se(fabs(d
- 0.2244) < 0.000001);
365 r
= safe_atod("0,5", &d
);
366 assert_se(r
== -EINVAL
);
370 assert_se(*e
== ',');
372 /* Check if this really is locale independent */
373 if (setlocale(LC_NUMERIC
, "de_DE.utf8")) {
375 r
= safe_atod("0.2244", &d
);
377 assert_se(fabs(d
- 0.2244) < 0.000001);
379 r
= safe_atod("0,5", &d
);
380 assert_se(r
== -EINVAL
);
383 assert_se(fabs(strtod("0,5", &e
) - 0.5) < 0.00001);
386 /* And check again, reset */
387 assert_se(setlocale(LC_NUMERIC
, "C"));
389 r
= safe_atod("0.2244", &d
);
391 assert_se(fabs(d
- 0.2244) < 0.000001);
393 r
= safe_atod("0,5", &d
);
394 assert_se(r
== -EINVAL
);
398 assert_se(*e
== ',');
401 static void test_strappend(void) {
402 _cleanup_free_
char *t1
, *t2
, *t3
, *t4
;
404 t1
= strappend(NULL
, NULL
);
405 assert_se(streq(t1
, ""));
407 t2
= strappend(NULL
, "suf");
408 assert_se(streq(t2
, "suf"));
410 t3
= strappend("pre", NULL
);
411 assert_se(streq(t3
, "pre"));
413 t4
= strappend("pre", "suf");
414 assert_se(streq(t4
, "presuf"));
417 static void test_strstrip(void) {
419 char input
[] = " hello, waldo. ";
422 assert_se(streq(r
, "hello, waldo."));
425 static void test_delete_chars(void) {
427 char input
[] = " hello, waldo. abc";
429 r
= delete_chars(input
, WHITESPACE
);
430 assert_se(streq(r
, "hello,waldo.abc"));
433 static void test_in_charset(void) {
434 assert_se(in_charset("dddaaabbbcccc", "abcd"));
435 assert_se(!in_charset("dddaaabbbcccc", "abc f"));
438 static void test_hexchar(void) {
439 assert_se(hexchar(0xa) == 'a');
440 assert_se(hexchar(0x0) == '0');
443 static void test_unhexchar(void) {
444 assert_se(unhexchar('a') == 0xA);
445 assert_se(unhexchar('A') == 0xA);
446 assert_se(unhexchar('0') == 0x0);
449 static void test_base32hexchar(void) {
450 assert_se(base32hexchar(0) == '0');
451 assert_se(base32hexchar(9) == '9');
452 assert_se(base32hexchar(10) == 'A');
453 assert_se(base32hexchar(31) == 'V');
456 static void test_unbase32hexchar(void) {
457 assert_se(unbase32hexchar('0') == 0);
458 assert_se(unbase32hexchar('9') == 9);
459 assert_se(unbase32hexchar('A') == 10);
460 assert_se(unbase32hexchar('V') == 31);
461 assert_se(unbase32hexchar('=') == -EINVAL
);
464 static void test_base64char(void) {
465 assert_se(base64char(0) == 'A');
466 assert_se(base64char(26) == 'a');
467 assert_se(base64char(63) == '/');
470 static void test_unbase64char(void) {
471 assert_se(unbase64char('A') == 0);
472 assert_se(unbase64char('Z') == 25);
473 assert_se(unbase64char('a') == 26);
474 assert_se(unbase64char('z') == 51);
475 assert_se(unbase64char('0') == 52);
476 assert_se(unbase64char('9') == 61);
477 assert_se(unbase64char('+') == 62);
478 assert_se(unbase64char('/') == 63);
479 assert_se(unbase64char('=') == -EINVAL
);
482 static void test_octchar(void) {
483 assert_se(octchar(00) == '0');
484 assert_se(octchar(07) == '7');
487 static void test_unoctchar(void) {
488 assert_se(unoctchar('0') == 00);
489 assert_se(unoctchar('7') == 07);
492 static void test_decchar(void) {
493 assert_se(decchar(0) == '0');
494 assert_se(decchar(9) == '9');
497 static void test_undecchar(void) {
498 assert_se(undecchar('0') == 0);
499 assert_se(undecchar('9') == 9);
502 static void test_unhexmem(void) {
503 const char *hex
= "efa214921";
504 const char *hex_invalid
= "efa214921o";
505 _cleanup_free_
char *hex2
= NULL
;
506 _cleanup_free_
void *mem
= NULL
;
509 assert_se(unhexmem(hex
, strlen(hex
), &mem
, &len
) == 0);
510 assert_se(unhexmem(hex
, strlen(hex
) + 1, &mem
, &len
) == -EINVAL
);
511 assert_se(unhexmem(hex_invalid
, strlen(hex_invalid
), &mem
, &len
) == -EINVAL
);
513 assert_se((hex2
= hexmem(mem
, len
)));
517 assert_se(memcmp(hex
, hex2
, strlen(hex
)) == 0);
521 assert_se(unhexmem(hex
, strlen(hex
) - 1, &mem
, &len
) == 0);
522 assert_se((hex2
= hexmem(mem
, len
)));
523 assert_se(memcmp(hex
, hex2
, strlen(hex
) - 1) == 0);
526 /* https://tools.ietf.org/html/rfc4648#section-10 */
527 static void test_base32hexmem(void) {
530 b32
= base32hexmem("", strlen(""), true);
532 assert_se(streq(b32
, ""));
535 b32
= base32hexmem("f", strlen("f"), true);
537 assert_se(streq(b32
, "CO======"));
540 b32
= base32hexmem("fo", strlen("fo"), true);
542 assert_se(streq(b32
, "CPNG===="));
545 b32
= base32hexmem("foo", strlen("foo"), true);
547 assert_se(streq(b32
, "CPNMU==="));
550 b32
= base32hexmem("foob", strlen("foob"), true);
552 assert_se(streq(b32
, "CPNMUOG="));
555 b32
= base32hexmem("fooba", strlen("fooba"), true);
557 assert_se(streq(b32
, "CPNMUOJ1"));
560 b32
= base32hexmem("foobar", strlen("foobar"), true);
562 assert_se(streq(b32
, "CPNMUOJ1E8======"));
565 b32
= base32hexmem("", strlen(""), false);
567 assert_se(streq(b32
, ""));
570 b32
= base32hexmem("f", strlen("f"), false);
572 assert_se(streq(b32
, "CO"));
575 b32
= base32hexmem("fo", strlen("fo"), false);
577 assert_se(streq(b32
, "CPNG"));
580 b32
= base32hexmem("foo", strlen("foo"), false);
582 assert_se(streq(b32
, "CPNMU"));
585 b32
= base32hexmem("foob", strlen("foob"), false);
587 assert_se(streq(b32
, "CPNMUOG"));
590 b32
= base32hexmem("fooba", strlen("fooba"), false);
592 assert_se(streq(b32
, "CPNMUOJ1"));
595 b32
= base32hexmem("foobar", strlen("foobar"), false);
597 assert_se(streq(b32
, "CPNMUOJ1E8"));
601 static void test_unbase32hexmem(void) {
605 assert_se(unbase32hexmem("", strlen(""), true, &mem
, &len
) == 0);
606 assert_se(streq(strndupa(mem
, len
), ""));
609 assert_se(unbase32hexmem("CO======", strlen("CO======"), true, &mem
, &len
) == 0);
610 assert_se(streq(strndupa(mem
, len
), "f"));
613 assert_se(unbase32hexmem("CPNG====", strlen("CPNG===="), true, &mem
, &len
) == 0);
614 assert_se(streq(strndupa(mem
, len
), "fo"));
617 assert_se(unbase32hexmem("CPNMU===", strlen("CPNMU==="), true, &mem
, &len
) == 0);
618 assert_se(streq(strndupa(mem
, len
), "foo"));
621 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), true, &mem
, &len
) == 0);
622 assert_se(streq(strndupa(mem
, len
), "foob"));
625 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == 0);
626 assert_se(streq(strndupa(mem
, len
), "fooba"));
629 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), true, &mem
, &len
) == 0);
630 assert_se(streq(strndupa(mem
, len
), "foobar"));
633 assert_se(unbase32hexmem("A", strlen("A"), true, &mem
, &len
) == -EINVAL
);
634 assert_se(unbase32hexmem("A=======", strlen("A======="), true, &mem
, &len
) == -EINVAL
);
635 assert_se(unbase32hexmem("AAA=====", strlen("AAA====="), true, &mem
, &len
) == -EINVAL
);
636 assert_se(unbase32hexmem("AAAAAA==", strlen("AAAAAA=="), true, &mem
, &len
) == -EINVAL
);
637 assert_se(unbase32hexmem("AB======", strlen("AB======"), true, &mem
, &len
) == -EINVAL
);
638 assert_se(unbase32hexmem("AAAB====", strlen("AAAB===="), true, &mem
, &len
) == -EINVAL
);
639 assert_se(unbase32hexmem("AAAAB===", strlen("AAAAB==="), true, &mem
, &len
) == -EINVAL
);
640 assert_se(unbase32hexmem("AAAAAAB=", strlen("AAAAAAB="), true, &mem
, &len
) == -EINVAL
);
642 assert_se(unbase32hexmem("XPNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
643 assert_se(unbase32hexmem("CXNMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
644 assert_se(unbase32hexmem("CPXMUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
645 assert_se(unbase32hexmem("CPNXUOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
646 assert_se(unbase32hexmem("CPNMXOJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
647 assert_se(unbase32hexmem("CPNMUXJ1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
648 assert_se(unbase32hexmem("CPNMUOX1", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
649 assert_se(unbase32hexmem("CPNMUOJX", strlen("CPNMUOJ1"), true, &mem
, &len
) == -EINVAL
);
651 assert_se(unbase32hexmem("", strlen(""), false, &mem
, &len
) == 0);
652 assert_se(streq(strndupa(mem
, len
), ""));
655 assert_se(unbase32hexmem("CO", strlen("CO"), false, &mem
, &len
) == 0);
656 assert_se(streq(strndupa(mem
, len
), "f"));
659 assert_se(unbase32hexmem("CPNG", strlen("CPNG"), false, &mem
, &len
) == 0);
660 assert_se(streq(strndupa(mem
, len
), "fo"));
663 assert_se(unbase32hexmem("CPNMU", strlen("CPNMU"), false, &mem
, &len
) == 0);
664 assert_se(streq(strndupa(mem
, len
), "foo"));
667 assert_se(unbase32hexmem("CPNMUOG", strlen("CPNMUOG"), false, &mem
, &len
) == 0);
668 assert_se(streq(strndupa(mem
, len
), "foob"));
671 assert_se(unbase32hexmem("CPNMUOJ1", strlen("CPNMUOJ1"), false, &mem
, &len
) == 0);
672 assert_se(streq(strndupa(mem
, len
), "fooba"));
675 assert_se(unbase32hexmem("CPNMUOJ1E8", strlen("CPNMUOJ1E8"), false, &mem
, &len
) == 0);
676 assert_se(streq(strndupa(mem
, len
), "foobar"));
679 assert_se(unbase32hexmem("CPNMUOG=", strlen("CPNMUOG="), false, &mem
, &len
) == -EINVAL
);
680 assert_se(unbase32hexmem("CPNMUOJ1E8======", strlen("CPNMUOJ1E8======"), false, &mem
, &len
) == -EINVAL
);
681 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
682 assert_se(unbase32hexmem("A", strlen("A"), false, &mem
, &len
) == -EINVAL
);
683 assert_se(unbase32hexmem("AAA", strlen("AAA"), false, &mem
, &len
) == -EINVAL
);
684 assert_se(unbase32hexmem("AAAAAA", strlen("AAAAAA"), false, &mem
, &len
) == -EINVAL
);
685 assert_se(unbase32hexmem("AB", strlen("AB"), false, &mem
, &len
) == -EINVAL
);
686 assert_se(unbase32hexmem("AAAB", strlen("AAAB"), false, &mem
, &len
) == -EINVAL
);
687 assert_se(unbase32hexmem("AAAAB", strlen("AAAAB"), false, &mem
, &len
) == -EINVAL
);
688 assert_se(unbase32hexmem("AAAAAAB", strlen("AAAAAAB"), false, &mem
, &len
) == -EINVAL
);
691 /* https://tools.ietf.org/html/rfc4648#section-10 */
692 static void test_base64mem(void) {
695 b64
= base64mem("", strlen(""));
697 assert_se(streq(b64
, ""));
700 b64
= base64mem("f", strlen("f"));
702 assert_se(streq(b64
, "Zg=="));
705 b64
= base64mem("fo", strlen("fo"));
707 assert_se(streq(b64
, "Zm8="));
710 b64
= base64mem("foo", strlen("foo"));
712 assert_se(streq(b64
, "Zm9v"));
715 b64
= base64mem("foob", strlen("foob"));
717 assert_se(streq(b64
, "Zm9vYg=="));
720 b64
= base64mem("fooba", strlen("fooba"));
722 assert_se(streq(b64
, "Zm9vYmE="));
725 b64
= base64mem("foobar", strlen("foobar"));
727 assert_se(streq(b64
, "Zm9vYmFy"));
731 static void test_unbase64mem(void) {
735 assert_se(unbase64mem("", strlen(""), &mem
, &len
) == 0);
736 assert_se(streq(strndupa(mem
, len
), ""));
739 assert_se(unbase64mem("Zg==", strlen("Zg=="), &mem
, &len
) == 0);
740 assert_se(streq(strndupa(mem
, len
), "f"));
743 assert_se(unbase64mem("Zm8=", strlen("Zm8="), &mem
, &len
) == 0);
744 assert_se(streq(strndupa(mem
, len
), "fo"));
747 assert_se(unbase64mem("Zm9v", strlen("Zm9v"), &mem
, &len
) == 0);
748 assert_se(streq(strndupa(mem
, len
), "foo"));
751 assert_se(unbase64mem("Zm9vYg==", strlen("Zm9vYg=="), &mem
, &len
) == 0);
752 assert_se(streq(strndupa(mem
, len
), "foob"));
755 assert_se(unbase64mem("Zm9vYmE=", strlen("Zm9vYmE="), &mem
, &len
) == 0);
756 assert_se(streq(strndupa(mem
, len
), "fooba"));
759 assert_se(unbase64mem("Zm9vYmFy", strlen("Zm9vYmFy"), &mem
, &len
) == 0);
760 assert_se(streq(strndupa(mem
, len
), "foobar"));
763 assert_se(unbase64mem("A", strlen("A"), &mem
, &len
) == -EINVAL
);
764 assert_se(unbase64mem("A====", strlen("A===="), &mem
, &len
) == -EINVAL
);
765 assert_se(unbase64mem("AAB==", strlen("AAB=="), &mem
, &len
) == -EINVAL
);
766 assert_se(unbase64mem("AAAB=", strlen("AAAB="), &mem
, &len
) == -EINVAL
);
769 static void test_cescape(void) {
770 _cleanup_free_
char *escaped
;
772 assert_se(escaped
= cescape("abc\\\"\b\f\n\r\t\v\a\003\177\234\313"));
773 assert_se(streq(escaped
, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\a\\003\\177\\234\\313"));
776 static void test_cunescape(void) {
777 _cleanup_free_
char *unescaped
;
779 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", 0, &unescaped
) < 0);
780 assert_se(cunescape("abc\\\\\\\"\\b\\f\\a\\n\\r\\t\\v\\003\\177\\234\\313\\000\\x00", UNESCAPE_RELAX
, &unescaped
) >= 0);
781 assert_se(streq_ptr(unescaped
, "abc\\\"\b\f\a\n\r\t\v\003\177\234\313\\000\\x00"));
782 unescaped
= mfree(unescaped
);
784 /* incomplete sequences */
785 assert_se(cunescape("\\x0", 0, &unescaped
) < 0);
786 assert_se(cunescape("\\x0", UNESCAPE_RELAX
, &unescaped
) >= 0);
787 assert_se(streq_ptr(unescaped
, "\\x0"));
788 unescaped
= mfree(unescaped
);
790 assert_se(cunescape("\\x", 0, &unescaped
) < 0);
791 assert_se(cunescape("\\x", UNESCAPE_RELAX
, &unescaped
) >= 0);
792 assert_se(streq_ptr(unescaped
, "\\x"));
793 unescaped
= mfree(unescaped
);
795 assert_se(cunescape("\\", 0, &unescaped
) < 0);
796 assert_se(cunescape("\\", UNESCAPE_RELAX
, &unescaped
) >= 0);
797 assert_se(streq_ptr(unescaped
, "\\"));
798 unescaped
= mfree(unescaped
);
800 assert_se(cunescape("\\11", 0, &unescaped
) < 0);
801 assert_se(cunescape("\\11", UNESCAPE_RELAX
, &unescaped
) >= 0);
802 assert_se(streq_ptr(unescaped
, "\\11"));
803 unescaped
= mfree(unescaped
);
805 assert_se(cunescape("\\1", 0, &unescaped
) < 0);
806 assert_se(cunescape("\\1", UNESCAPE_RELAX
, &unescaped
) >= 0);
807 assert_se(streq_ptr(unescaped
, "\\1"));
808 unescaped
= mfree(unescaped
);
810 assert_se(cunescape("\\u0000", 0, &unescaped
) < 0);
811 assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX
, &unescaped
) >= 0);
812 assert_se(streq_ptr(unescaped
, "ßßΠA"));
813 unescaped
= mfree(unescaped
);
815 assert_se(cunescape("\\073", 0, &unescaped
) >= 0);
816 assert_se(streq_ptr(unescaped
, ";"));
819 static void test_foreach_word(void) {
820 const char *word
, *state
;
823 const char test
[] = "test abc d\te f ";
824 const char * const expected
[] = {
834 FOREACH_WORD(word
, l
, test
, state
)
835 assert_se(strneq(expected
[i
++], word
, l
));
838 static void check(const char *test
, char** expected
, bool trailing
) {
839 const char *word
, *state
;
843 printf("<<<%s>>>\n", test
);
844 FOREACH_WORD_QUOTED(word
, l
, test
, state
) {
845 _cleanup_free_
char *t
= NULL
;
847 assert_se(t
= strndup(word
, l
));
848 assert_se(strneq(expected
[i
++], word
, l
));
851 printf("<<<%s>>>\n", state
);
852 assert_se(expected
[i
] == NULL
);
853 assert_se(isempty(state
) == !trailing
);
856 static void test_foreach_word_quoted(void) {
857 check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
881 static void test_memdup_multiply(void) {
882 int org
[] = {1, 2, 3};
885 dup
= (int*)memdup_multiply(org
, sizeof(int), 3);
888 assert_se(dup
[0] == 1);
889 assert_se(dup
[1] == 2);
890 assert_se(dup
[2] == 3);
894 static void test_u64log2(void) {
895 assert_se(u64log2(0) == 0);
896 assert_se(u64log2(8) == 3);
897 assert_se(u64log2(9) == 3);
898 assert_se(u64log2(15) == 3);
899 assert_se(u64log2(16) == 4);
900 assert_se(u64log2(1024*1024) == 20);
901 assert_se(u64log2(1024*1024+5) == 20);
904 static void test_protect_errno(void) {
910 assert_se(errno
== 12);
913 static void test_parse_size(void) {
916 assert_se(parse_size("111", 1024, &bytes
) == 0);
917 assert_se(bytes
== 111);
919 assert_se(parse_size("111.4", 1024, &bytes
) == 0);
920 assert_se(bytes
== 111);
922 assert_se(parse_size(" 112 B", 1024, &bytes
) == 0);
923 assert_se(bytes
== 112);
925 assert_se(parse_size(" 112.6 B", 1024, &bytes
) == 0);
926 assert_se(bytes
== 112);
928 assert_se(parse_size("3.5 K", 1024, &bytes
) == 0);
929 assert_se(bytes
== 3*1024 + 512);
931 assert_se(parse_size("3. K", 1024, &bytes
) == 0);
932 assert_se(bytes
== 3*1024);
934 assert_se(parse_size("3.0 K", 1024, &bytes
) == 0);
935 assert_se(bytes
== 3*1024);
937 assert_se(parse_size("3. 0 K", 1024, &bytes
) == -EINVAL
);
939 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes
) == 0);
940 assert_se(bytes
== 4*1024*1024 + 11 * 1024 + 512);
942 assert_se(parse_size("3B3.5G", 1024, &bytes
) == -EINVAL
);
944 assert_se(parse_size("3.5G3B", 1024, &bytes
) == 0);
945 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
947 assert_se(parse_size("3.5G 4B", 1024, &bytes
) == 0);
948 assert_se(bytes
== 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
950 assert_se(parse_size("3B3G4T", 1024, &bytes
) == -EINVAL
);
952 assert_se(parse_size("4T3G3B", 1024, &bytes
) == 0);
953 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
955 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes
) == 0);
956 assert_se(bytes
== (4ULL*1024 + 3)*1024*1024*1024 + 3);
958 assert_se(parse_size("12P", 1024, &bytes
) == 0);
959 assert_se(bytes
== 12ULL * 1024*1024*1024*1024*1024);
961 assert_se(parse_size("12P12P", 1024, &bytes
) == -EINVAL
);
963 assert_se(parse_size("3E 2P", 1024, &bytes
) == 0);
964 assert_se(bytes
== (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
966 assert_se(parse_size("12X", 1024, &bytes
) == -EINVAL
);
968 assert_se(parse_size("12.5X", 1024, &bytes
) == -EINVAL
);
970 assert_se(parse_size("12.5e3", 1024, &bytes
) == -EINVAL
);
972 assert_se(parse_size("1024E", 1024, &bytes
) == -ERANGE
);
973 assert_se(parse_size("-1", 1024, &bytes
) == -ERANGE
);
974 assert_se(parse_size("-1024E", 1024, &bytes
) == -ERANGE
);
976 assert_se(parse_size("-1024P", 1024, &bytes
) == -ERANGE
);
978 assert_se(parse_size("-10B 20K", 1024, &bytes
) == -ERANGE
);
981 static void test_parse_cpu_set(void) {
986 /* Simple range (from CPUAffinity example) */
987 ncpus
= parse_cpu_set_and_warn("1 2", &c
, NULL
, "fake", 1, "CPUAffinity");
988 assert_se(ncpus
>= 1024);
989 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus
), c
));
990 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus
), c
));
991 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 2);
994 /* A more interesting range */
995 ncpus
= parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c
, NULL
, "fake", 1, "CPUAffinity");
996 assert_se(ncpus
>= 1024);
997 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 8);
998 for (cpu
= 0; cpu
< 4; cpu
++)
999 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1000 for (cpu
= 8; cpu
< 12; cpu
++)
1001 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1004 /* Quoted strings */
1005 ncpus
= parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c
, NULL
, "fake", 1, "CPUAffinity");
1006 assert_se(ncpus
>= 1024);
1007 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus
), c
) == 4);
1008 for (cpu
= 8; cpu
< 12; cpu
++)
1009 assert_se(CPU_ISSET_S(cpu
, CPU_ALLOC_SIZE(ncpus
), c
));
1012 /* Use commas as separators */
1013 ncpus
= parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c
, NULL
, "fake", 1, "CPUAffinity");
1014 assert_se(ncpus
< 0);
1018 ncpus
= parse_cpu_set_and_warn("0-3,8-11", &c
, NULL
, "fake", 1, "CPUAffinity");
1019 assert_se(ncpus
< 0);
1023 ncpus
= parse_cpu_set_and_warn("0 1 2 3 garbage", &c
, NULL
, "fake", 1, "CPUAffinity");
1024 assert_se(ncpus
< 0);
1029 ncpus
= parse_cpu_set_and_warn("", &c
, NULL
, "fake", 1, "CPUAffinity");
1030 assert_se(ncpus
== 0); /* empty string returns 0 */
1033 /* Runnaway quoted string */
1034 ncpus
= parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c
, NULL
, "fake", 1, "CPUAffinity");
1035 assert_se(ncpus
< 0);
1039 static void test_config_parse_iec_uint64(void) {
1040 uint64_t offset
= 0;
1041 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset
, NULL
) == 0);
1042 assert_se(offset
== 4 * 1024 * 1024);
1044 assert_se(config_parse_iec_uint64(NULL
, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset
, NULL
) == 0);
1047 static void test_strextend(void) {
1048 _cleanup_free_
char *str
= strdup("0123");
1049 strextend(&str
, "456", "78", "9", NULL
);
1050 assert_se(streq(str
, "0123456789"));
1053 static void test_strrep(void) {
1054 _cleanup_free_
char *one
, *three
, *zero
;
1055 one
= strrep("waldo", 1);
1056 three
= strrep("waldo", 3);
1057 zero
= strrep("waldo", 0);
1059 assert_se(streq(one
, "waldo"));
1060 assert_se(streq(three
, "waldowaldowaldo"));
1061 assert_se(streq(zero
, ""));
1064 static void test_split_pair(void) {
1065 _cleanup_free_
char *a
= NULL
, *b
= NULL
;
1067 assert_se(split_pair("", "", &a
, &b
) == -EINVAL
);
1068 assert_se(split_pair("foo=bar", "", &a
, &b
) == -EINVAL
);
1069 assert_se(split_pair("", "=", &a
, &b
) == -EINVAL
);
1070 assert_se(split_pair("foo=bar", "=", &a
, &b
) >= 0);
1071 assert_se(streq(a
, "foo"));
1072 assert_se(streq(b
, "bar"));
1075 assert_se(split_pair("==", "==", &a
, &b
) >= 0);
1076 assert_se(streq(a
, ""));
1077 assert_se(streq(b
, ""));
1081 assert_se(split_pair("===", "==", &a
, &b
) >= 0);
1082 assert_se(streq(a
, ""));
1083 assert_se(streq(b
, "="));
1086 static void test_fstab_node_to_udev_node(void) {
1089 n
= fstab_node_to_udev_node("LABEL=applé/jack");
1091 assert_se(streq(n
, "/dev/disk/by-label/applé\\x2fjack"));
1094 n
= fstab_node_to_udev_node("PARTLABEL=pinkié pie");
1096 assert_se(streq(n
, "/dev/disk/by-partlabel/pinkié\\x20pie"));
1099 n
= fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1101 assert_se(streq(n
, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1104 n
= fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
1106 assert_se(streq(n
, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
1109 n
= fstab_node_to_udev_node("PONIES=awesome");
1111 assert_se(streq(n
, "PONIES=awesome"));
1114 n
= fstab_node_to_udev_node("/dev/xda1");
1116 assert_se(streq(n
, "/dev/xda1"));
1120 static void test_get_files_in_directory(void) {
1121 _cleanup_strv_free_
char **l
= NULL
, **t
= NULL
;
1123 assert_se(get_files_in_directory("/tmp", &l
) >= 0);
1124 assert_se(get_files_in_directory(".", &t
) >= 0);
1125 assert_se(get_files_in_directory(".", NULL
) >= 0);
1128 static void test_in_set(void) {
1129 assert_se(IN_SET(1, 1));
1130 assert_se(IN_SET(1, 1, 2, 3, 4));
1131 assert_se(IN_SET(2, 1, 2, 3, 4));
1132 assert_se(IN_SET(3, 1, 2, 3, 4));
1133 assert_se(IN_SET(4, 1, 2, 3, 4));
1134 assert_se(!IN_SET(0, 1));
1135 assert_se(!IN_SET(0, 1, 2, 3, 4));
1138 static void test_writing_tmpfile(void) {
1139 char name
[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
1140 _cleanup_free_
char *contents
= NULL
;
1143 struct iovec iov
[3];
1145 IOVEC_SET_STRING(iov
[0], "abc\n");
1146 IOVEC_SET_STRING(iov
[1], ALPHANUMERICAL
"\n");
1147 IOVEC_SET_STRING(iov
[2], "");
1149 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1150 printf("tmpfile: %s", name
);
1152 r
= writev(fd
, iov
, 3);
1155 r
= read_full_file(name
, &contents
, &size
);
1157 printf("contents: %s", contents
);
1158 assert_se(streq(contents
, "abc\n" ALPHANUMERICAL
"\n"));
1163 static void test_hexdump(void) {
1167 hexdump(stdout
, NULL
, 0);
1168 hexdump(stdout
, "", 0);
1169 hexdump(stdout
, "", 1);
1170 hexdump(stdout
, "x", 1);
1171 hexdump(stdout
, "x", 2);
1172 hexdump(stdout
, "foobar", 7);
1173 hexdump(stdout
, "f\nobar", 7);
1174 hexdump(stdout
, "xxxxxxxxxxxxxxxxxxxxyz", 23);
1176 for (i
= 0; i
< ELEMENTSOF(data
); i
++)
1179 hexdump(stdout
, data
, sizeof(data
));
1182 static void test_log2i(void) {
1183 assert_se(log2i(1) == 0);
1184 assert_se(log2i(2) == 1);
1185 assert_se(log2i(3) == 1);
1186 assert_se(log2i(4) == 2);
1187 assert_se(log2i(32) == 5);
1188 assert_se(log2i(33) == 5);
1189 assert_se(log2i(63) == 5);
1190 assert_se(log2i(INT_MAX
) == sizeof(int)*8-2);
1193 static void test_foreach_string(void) {
1194 const char * const t
[] = {
1203 FOREACH_STRING(x
, "foo", "bar", "waldo")
1204 assert_se(streq_ptr(t
[i
++], x
));
1208 FOREACH_STRING(x
, "zzz")
1209 assert_se(streq(x
, "zzz"));
1212 static void test_filename_is_valid(void) {
1213 char foo
[FILENAME_MAX
+2];
1216 assert_se(!filename_is_valid(""));
1217 assert_se(!filename_is_valid("/bar/foo"));
1218 assert_se(!filename_is_valid("/"));
1219 assert_se(!filename_is_valid("."));
1220 assert_se(!filename_is_valid(".."));
1222 for (i
=0; i
<FILENAME_MAX
+1; i
++)
1224 foo
[FILENAME_MAX
+1] = '\0';
1226 assert_se(!filename_is_valid(foo
));
1228 assert_se(filename_is_valid("foo_bar-333"));
1229 assert_se(filename_is_valid("o.o"));
1232 static void test_string_has_cc(void) {
1233 assert_se(string_has_cc("abc\1", NULL
));
1234 assert_se(string_has_cc("abc\x7f", NULL
));
1235 assert_se(string_has_cc("abc\x7f", NULL
));
1236 assert_se(string_has_cc("abc\t\x7f", "\t"));
1237 assert_se(string_has_cc("abc\t\x7f", "\t"));
1238 assert_se(string_has_cc("\x7f", "\t"));
1239 assert_se(string_has_cc("\x7f", "\t\a"));
1241 assert_se(!string_has_cc("abc\t\t", "\t"));
1242 assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
1243 assert_se(!string_has_cc("a\ab\tc", "\t\a"));
1246 static void test_ascii_strlower(void) {
1247 char a
[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
1248 assert_se(streq(ascii_strlower(a
), "aabbcc jk ii od lkjjj kkd lk"));
1251 static void test_files_same(void) {
1252 _cleanup_close_
int fd
= -1;
1253 char name
[] = "/tmp/test-files_same.XXXXXX";
1254 char name_alias
[] = "/tmp/test-files_same.alias";
1256 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1258 assert_se(symlink(name
, name_alias
) >= 0);
1260 assert_se(files_same(name
, name
));
1261 assert_se(files_same(name
, name_alias
));
1267 static void test_is_valid_documentation_url(void) {
1268 assert_se(documentation_url_is_valid("http://www.freedesktop.org/wiki/Software/systemd"));
1269 assert_se(documentation_url_is_valid("https://www.kernel.org/doc/Documentation/binfmt_misc.txt"));
1270 assert_se(documentation_url_is_valid("file:/foo/foo"));
1271 assert_se(documentation_url_is_valid("man:systemd.special(7)"));
1272 assert_se(documentation_url_is_valid("info:bar"));
1274 assert_se(!documentation_url_is_valid("foo:"));
1275 assert_se(!documentation_url_is_valid("info:"));
1276 assert_se(!documentation_url_is_valid(""));
1279 static void test_file_in_same_dir(void) {
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");
1291 assert_se(streq(t
, "a"));
1294 t
= file_in_same_dir("a/", "a");
1295 assert_se(streq(t
, "a/a"));
1298 t
= file_in_same_dir("bar/foo", "bar");
1299 assert_se(streq(t
, "bar/bar"));
1303 static void test_endswith(void) {
1304 assert_se(endswith("foobar", "bar"));
1305 assert_se(endswith("foobar", ""));
1306 assert_se(endswith("foobar", "foobar"));
1307 assert_se(endswith("", ""));
1309 assert_se(!endswith("foobar", "foo"));
1310 assert_se(!endswith("foobar", "foobarfoofoo"));
1313 static void test_endswith_no_case(void) {
1314 assert_se(endswith_no_case("fooBAR", "bar"));
1315 assert_se(endswith_no_case("foobar", ""));
1316 assert_se(endswith_no_case("foobar", "FOOBAR"));
1317 assert_se(endswith_no_case("", ""));
1319 assert_se(!endswith_no_case("foobar", "FOO"));
1320 assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
1323 static void test_close_nointr(void) {
1324 char name
[] = "/tmp/test-test-close_nointr.XXXXXX";
1327 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1329 assert_se(close_nointr(fd
) >= 0);
1330 assert_se(close_nointr(fd
) < 0);
1336 static void test_unlink_noerrno(void) {
1337 char name
[] = "/tmp/test-close_nointr.XXXXXX";
1340 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1342 assert_se(close_nointr(fd
) >= 0);
1347 assert_se(unlink_noerrno(name
) >= 0);
1348 assert_se(errno
== -42);
1349 assert_se(unlink_noerrno(name
) < 0);
1350 assert_se(errno
== -42);
1354 static void test_readlink_and_make_absolute(void) {
1355 char tempdir
[] = "/tmp/test-readlink_and_make_absolute";
1356 char name
[] = "/tmp/test-readlink_and_make_absolute/original";
1357 char name2
[] = "test-readlink_and_make_absolute/original";
1358 char name_alias
[] = "/tmp/test-readlink_and_make_absolute-alias";
1361 assert_se(mkdir_safe(tempdir
, 0755, getuid(), getgid()) >= 0);
1362 assert_se(touch(name
) >= 0);
1364 assert_se(symlink(name
, name_alias
) >= 0);
1365 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1366 assert_se(streq(r
, name
));
1368 assert_se(unlink(name_alias
) >= 0);
1370 assert_se(chdir(tempdir
) >= 0);
1371 assert_se(symlink(name2
, name_alias
) >= 0);
1372 assert_se(readlink_and_make_absolute(name_alias
, &r
) >= 0);
1373 assert_se(streq(r
, name
));
1375 assert_se(unlink(name_alias
) >= 0);
1377 assert_se(rm_rf(tempdir
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
1380 static void test_ignore_signals(void) {
1381 assert_se(ignore_signals(SIGINT
, -1) >= 0);
1382 assert_se(kill(getpid(), SIGINT
) >= 0);
1383 assert_se(ignore_signals(SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1384 assert_se(kill(getpid(), SIGUSR1
) >= 0);
1385 assert_se(kill(getpid(), SIGUSR2
) >= 0);
1386 assert_se(kill(getpid(), SIGTERM
) >= 0);
1387 assert_se(kill(getpid(), SIGPIPE
) >= 0);
1388 assert_se(default_signals(SIGINT
, SIGUSR1
, SIGUSR2
, SIGTERM
, SIGPIPE
, -1) >= 0);
1391 static void test_strshorten(void) {
1392 char s
[] = "foobar";
1394 assert_se(strlen(strshorten(s
, 6)) == 6);
1395 assert_se(strlen(strshorten(s
, 12)) == 6);
1396 assert_se(strlen(strshorten(s
, 2)) == 2);
1397 assert_se(strlen(strshorten(s
, 0)) == 0);
1400 static void test_strjoina(void) {
1403 actual
= strjoina("", "foo", "bar");
1404 assert_se(streq(actual
, "foobar"));
1406 actual
= strjoina("foo", "bar", "baz");
1407 assert_se(streq(actual
, "foobarbaz"));
1409 actual
= strjoina("foo", "", "bar", "baz");
1410 assert_se(streq(actual
, "foobarbaz"));
1412 actual
= strjoina("foo");
1413 assert_se(streq(actual
, "foo"));
1415 actual
= strjoina(NULL
);
1416 assert_se(streq(actual
, ""));
1418 actual
= strjoina(NULL
, "foo");
1419 assert_se(streq(actual
, ""));
1421 actual
= strjoina("foo", NULL
, "bar");
1422 assert_se(streq(actual
, "foo"));
1425 static void test_is_symlink(void) {
1426 char name
[] = "/tmp/test-is_symlink.XXXXXX";
1427 char name_link
[] = "/tmp/test-is_symlink.link";
1428 _cleanup_close_
int fd
= -1;
1430 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1432 assert_se(symlink(name
, name_link
) >= 0);
1434 assert_se(is_symlink(name
) == 0);
1435 assert_se(is_symlink(name_link
) == 1);
1436 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
1443 static void test_search_and_fopen(void) {
1444 const char *dirs
[] = {"/tmp/foo/bar", "/tmp", NULL
};
1445 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1450 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1454 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1458 r
= search_and_fopen(name
, "r", NULL
, dirs
, &f
);
1462 r
= search_and_fopen(basename(name
), "r", "/", dirs
, &f
);
1466 r
= search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1468 r
= search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1474 r
= search_and_fopen(basename(name
), "r", NULL
, dirs
, &f
);
1479 static void test_search_and_fopen_nulstr(void) {
1480 const char dirs
[] = "/tmp/foo/bar\0/tmp\0";
1481 char name
[] = "/tmp/test-search_and_fopen.XXXXXX";
1486 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1490 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1494 r
= search_and_fopen_nulstr(name
, "r", NULL
, dirs
, &f
);
1498 r
= search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL
, dirs
, &f
);
1500 r
= search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL
, dirs
, &f
);
1506 r
= search_and_fopen_nulstr(basename(name
), "r", NULL
, dirs
, &f
);
1510 static void test_glob_exists(void) {
1511 char name
[] = "/tmp/test-glob_exists.XXXXXX";
1515 fd
= mkostemp_safe(name
, O_RDWR
|O_CLOEXEC
);
1519 r
= glob_exists("/tmp/test-glob_exists*");
1524 r
= glob_exists("/tmp/test-glob_exists*");
1528 static void test_execute_directory(void) {
1529 char template_lo
[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
1530 char template_hi
[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
1531 const char * dirs
[] = {template_hi
, template_lo
, NULL
};
1532 const char *name
, *name2
, *name3
, *overridden
, *override
, *masked
, *mask
;
1534 assert_se(mkdtemp(template_lo
));
1535 assert_se(mkdtemp(template_hi
));
1537 name
= strjoina(template_lo
, "/script");
1538 name2
= strjoina(template_hi
, "/script2");
1539 name3
= strjoina(template_lo
, "/useless");
1540 overridden
= strjoina(template_lo
, "/overridden");
1541 override
= strjoina(template_hi
, "/overridden");
1542 masked
= strjoina(template_lo
, "/masked");
1543 mask
= strjoina(template_hi
, "/masked");
1545 assert_se(write_string_file(name
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE
) == 0);
1546 assert_se(write_string_file(name2
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE
) == 0);
1547 assert_se(write_string_file(overridden
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1548 assert_se(write_string_file(override
, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE
) == 0);
1549 assert_se(write_string_file(masked
, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE
) == 0);
1550 assert_se(symlink("/dev/null", mask
) == 0);
1551 assert_se(chmod(name
, 0755) == 0);
1552 assert_se(chmod(name2
, 0755) == 0);
1553 assert_se(chmod(overridden
, 0755) == 0);
1554 assert_se(chmod(override
, 0755) == 0);
1555 assert_se(chmod(masked
, 0755) == 0);
1556 assert_se(touch(name3
) >= 0);
1558 execute_directories(dirs
, DEFAULT_TIMEOUT_USEC
, NULL
);
1560 assert_se(chdir(template_lo
) == 0);
1561 assert_se(access("it_works", F_OK
) >= 0);
1562 assert_se(access("failed", F_OK
) < 0);
1564 assert_se(chdir(template_hi
) == 0);
1565 assert_se(access("it_works2", F_OK
) >= 0);
1566 assert_se(access("failed", F_OK
) < 0);
1568 (void) rm_rf(template_lo
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1569 (void) rm_rf(template_hi
, REMOVE_ROOT
|REMOVE_PHYSICAL
);
1572 static void test_extract_first_word(void) {
1573 const char *p
, *original
;
1576 p
= original
= "foobar waldo";
1577 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1578 assert_se(streq(t
, "foobar"));
1580 assert_se(p
== original
+ 7);
1582 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1583 assert_se(streq(t
, "waldo"));
1585 assert_se(isempty(p
));
1587 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1589 assert_se(isempty(p
));
1591 p
= original
= "\"foobar\" \'waldo\'";
1592 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1593 assert_se(streq(t
, "\"foobar\""));
1595 assert_se(p
== original
+ 9);
1597 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1598 assert_se(streq(t
, "\'waldo\'"));
1600 assert_se(isempty(p
));
1602 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1604 assert_se(isempty(p
));
1606 p
= original
= "\"foobar\" \'waldo\'";
1607 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1608 assert_se(streq(t
, "foobar"));
1610 assert_se(p
== original
+ 9);
1612 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1613 assert_se(streq(t
, "waldo"));
1615 assert_se(isempty(p
));
1617 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 0);
1619 assert_se(isempty(p
));
1621 p
= original
= "\"";
1622 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1623 assert_se(streq(t
, "\""));
1625 assert_se(isempty(p
));
1627 p
= original
= "\"";
1628 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1629 assert_se(p
== original
+ 1);
1631 p
= original
= "\'";
1632 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1633 assert_se(streq(t
, "\'"));
1635 assert_se(isempty(p
));
1637 p
= original
= "\'";
1638 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1639 assert_se(p
== original
+ 1);
1641 p
= original
= "\'fooo";
1642 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == 1);
1643 assert_se(streq(t
, "\'fooo"));
1645 assert_se(isempty(p
));
1647 p
= original
= "\'fooo";
1648 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) == -EINVAL
);
1649 assert_se(p
== original
+ 5);
1651 p
= original
= "\'fooo";
1652 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1653 assert_se(streq(t
, "fooo"));
1655 assert_se(isempty(p
));
1657 p
= original
= "\"fooo";
1658 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1659 assert_se(streq(t
, "fooo"));
1661 assert_se(isempty(p
));
1663 p
= original
= "yay\'foo\'bar";
1664 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1665 assert_se(streq(t
, "yay\'foo\'bar"));
1667 assert_se(isempty(p
));
1669 p
= original
= "yay\'foo\'bar";
1670 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1671 assert_se(streq(t
, "yayfoobar"));
1673 assert_se(isempty(p
));
1675 p
= original
= " foobar ";
1676 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1677 assert_se(streq(t
, "foobar"));
1679 assert_se(isempty(p
));
1681 p
= original
= " foo\\ba\\x6ar ";
1682 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1683 assert_se(streq(t
, "foo\ba\x6ar"));
1685 assert_se(isempty(p
));
1687 p
= original
= " foo\\ba\\x6ar ";
1688 assert_se(extract_first_word(&p
, &t
, NULL
, 0) > 0);
1689 assert_se(streq(t
, "foobax6ar"));
1691 assert_se(isempty(p
));
1693 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1694 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) > 0);
1695 assert_se(streq(t
, "föo"));
1697 assert_se(p
== original
+ 13);
1699 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
) > 0);
1700 assert_se(streq(t
, "pi\360\237\222\251le"));
1702 assert_se(isempty(p
));
1704 p
= original
= "fooo\\";
1705 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1706 assert_se(streq(t
, "fooo"));
1708 assert_se(isempty(p
));
1710 p
= original
= "fooo\\";
1711 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1712 assert_se(streq(t
, "fooo\\"));
1714 assert_se(isempty(p
));
1716 p
= original
= "fooo\\";
1717 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1718 assert_se(streq(t
, "fooo\\"));
1720 assert_se(isempty(p
));
1722 p
= original
= "fooo\\";
1723 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1724 assert_se(streq(t
, "fooo\\"));
1726 assert_se(isempty(p
));
1728 p
= original
= "\"foo\\";
1729 assert_se(extract_first_word(&p
, &t
, NULL
, 0) == -EINVAL
);
1730 assert_se(p
== original
+ 5);
1732 p
= original
= "\"foo\\";
1733 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
) > 0);
1734 assert_se(streq(t
, "foo"));
1736 assert_se(isempty(p
));
1738 p
= original
= "foo::bar";
1739 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1740 assert_se(streq(t
, "foo"));
1742 assert_se(p
== original
+ 5);
1744 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1745 assert_se(streq(t
, "bar"));
1747 assert_se(isempty(p
));
1749 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1751 assert_se(isempty(p
));
1753 p
= original
= "foo\\:bar::waldo";
1754 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1755 assert_se(streq(t
, "foo:bar"));
1757 assert_se(p
== original
+ 10);
1759 assert_se(extract_first_word(&p
, &t
, ":", 0) == 1);
1760 assert_se(streq(t
, "waldo"));
1762 assert_se(isempty(p
));
1764 assert_se(extract_first_word(&p
, &t
, ":", 0) == 0);
1766 assert_se(isempty(p
));
1768 p
= original
= "\"foo\\";
1769 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
) == -EINVAL
);
1770 assert_se(p
== original
+ 5);
1772 p
= original
= "\"foo\\";
1773 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1774 assert_se(streq(t
, "foo\\"));
1776 assert_se(isempty(p
));
1778 p
= original
= "\"foo\\";
1779 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1780 assert_se(streq(t
, "foo\\"));
1782 assert_se(isempty(p
));
1784 p
= original
= "fooo\\ bar quux";
1785 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_RELAX
) > 0);
1786 assert_se(streq(t
, "fooo bar"));
1788 assert_se(p
== original
+ 10);
1790 p
= original
= "fooo\\ bar quux";
1791 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
) > 0);
1792 assert_se(streq(t
, "fooo bar"));
1794 assert_se(p
== original
+ 10);
1796 p
= original
= "fooo\\ bar quux";
1797 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE_RELAX
|EXTRACT_RELAX
) > 0);
1798 assert_se(streq(t
, "fooo bar"));
1800 assert_se(p
== original
+ 10);
1802 p
= original
= "fooo\\ bar quux";
1803 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1804 assert_se(p
== original
+ 5);
1806 p
= original
= "fooo\\ bar quux";
1807 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1808 assert_se(streq(t
, "fooo\\ bar"));
1810 assert_se(p
== original
+ 10);
1812 p
= original
= "\\w+@\\K[\\d.]+";
1813 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
) == -EINVAL
);
1814 assert_se(p
== original
+ 1);
1816 p
= original
= "\\w+@\\K[\\d.]+";
1817 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1818 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
1820 assert_se(isempty(p
));
1822 p
= original
= "\\w+\\b";
1823 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
|EXTRACT_CUNESCAPE_RELAX
) > 0);
1824 assert_se(streq(t
, "\\w+\b"));
1826 assert_se(isempty(p
));
1828 p
= original
= "-N ''";
1829 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1830 assert_se(streq(t
, "-N"));
1832 assert_se(p
== original
+ 3);
1834 assert_se(extract_first_word(&p
, &t
, NULL
, EXTRACT_QUOTES
) > 0);
1835 assert_se(streq(t
, ""));
1837 assert_se(isempty(p
));
1839 p
= original
= ":foo\\:bar::waldo:";
1840 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1842 assert_se(streq(t
, ""));
1844 assert_se(p
== original
+ 1);
1846 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1847 assert_se(streq(t
, "foo:bar"));
1849 assert_se(p
== original
+ 10);
1851 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1853 assert_se(streq(t
, ""));
1855 assert_se(p
== original
+ 11);
1857 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1858 assert_se(streq(t
, "waldo"));
1860 assert_se(p
== original
+ 17);
1862 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 1);
1863 assert_se(streq(t
, ""));
1865 assert_se(p
== NULL
);
1867 assert_se(extract_first_word(&p
, &t
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
) == 0);
1872 static void test_extract_first_word_and_warn(void) {
1873 const char *p
, *original
;
1876 p
= original
= "foobar waldo";
1877 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1878 assert_se(streq(t
, "foobar"));
1880 assert_se(p
== original
+ 7);
1882 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1883 assert_se(streq(t
, "waldo"));
1885 assert_se(isempty(p
));
1887 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1889 assert_se(isempty(p
));
1891 p
= original
= "\"foobar\" \'waldo\'";
1892 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1893 assert_se(streq(t
, "foobar"));
1895 assert_se(p
== original
+ 9);
1897 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) > 0);
1898 assert_se(streq(t
, "waldo"));
1900 assert_se(isempty(p
));
1902 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) == 0);
1904 assert_se(isempty(p
));
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
= "\'";
1911 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1912 assert_se(p
== original
+ 1);
1914 p
= original
= "\'fooo";
1915 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1916 assert_se(p
== original
+ 5);
1918 p
= original
= "\'fooo";
1919 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1920 assert_se(streq(t
, "fooo"));
1922 assert_se(isempty(p
));
1924 p
= original
= " foo\\ba\\x6ar ";
1925 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1926 assert_se(streq(t
, "foo\ba\x6ar"));
1928 assert_se(isempty(p
));
1930 p
= original
= " foo\\ba\\x6ar ";
1931 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1932 assert_se(streq(t
, "foobax6ar"));
1934 assert_se(isempty(p
));
1936 p
= original
= " f\\u00f6o \"pi\\U0001F4A9le\" ";
1937 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1938 assert_se(streq(t
, "föo"));
1940 assert_se(p
== original
+ 13);
1942 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1943 assert_se(streq(t
, "pi\360\237\222\251le"));
1945 assert_se(isempty(p
));
1947 p
= original
= "fooo\\";
1948 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1949 assert_se(streq(t
, "fooo"));
1951 assert_se(isempty(p
));
1953 p
= original
= "fooo\\";
1954 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1955 assert_se(streq(t
, "fooo\\"));
1957 assert_se(isempty(p
));
1959 p
= original
= "fooo\\";
1960 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1961 assert_se(streq(t
, "fooo\\"));
1963 assert_se(isempty(p
));
1965 p
= original
= "\"foo\\";
1966 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
, NULL
, "fake", 1, original
) == -EINVAL
);
1967 assert_se(p
== original
+ 5);
1969 p
= original
= "\"foo\\";
1970 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1971 assert_se(streq(t
, "foo"));
1973 assert_se(isempty(p
));
1975 p
= original
= "\"foo\\";
1976 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) == -EINVAL
);
1977 assert_se(p
== original
+ 5);
1979 p
= original
= "\"foo\\";
1980 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_QUOTES
|EXTRACT_CUNESCAPE
|EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1981 assert_se(streq(t
, "foo"));
1983 assert_se(isempty(p
));
1985 p
= original
= "fooo\\ bar quux";
1986 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_RELAX
, NULL
, "fake", 1, original
) > 0);
1987 assert_se(streq(t
, "fooo bar"));
1989 assert_se(p
== original
+ 10);
1991 p
= original
= "fooo\\ bar quux";
1992 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, 0, NULL
, "fake", 1, original
) > 0);
1993 assert_se(streq(t
, "fooo bar"));
1995 assert_se(p
== original
+ 10);
1997 p
= original
= "fooo\\ bar quux";
1998 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
1999 assert_se(streq(t
, "fooo\\ bar"));
2001 assert_se(p
== original
+ 10);
2003 p
= original
= "\\w+@\\K[\\d.]+";
2004 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
2005 assert_se(streq(t
, "\\w+@\\K[\\d.]+"));
2007 assert_se(isempty(p
));
2009 p
= original
= "\\w+\\b";
2010 assert_se(extract_first_word_and_warn(&p
, &t
, NULL
, EXTRACT_CUNESCAPE
, NULL
, "fake", 1, original
) > 0);
2011 assert_se(streq(t
, "\\w+\b"));
2013 assert_se(isempty(p
));
2016 static void test_extract_many_words(void) {
2017 const char *p
, *original
;
2020 p
= original
= "foobar waldi piep";
2021 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 3);
2022 assert_se(isempty(p
));
2023 assert_se(streq_ptr(a
, "foobar"));
2024 assert_se(streq_ptr(b
, "waldi"));
2025 assert_se(streq_ptr(c
, "piep"));
2030 p
= original
= "'foobar' wa\"ld\"i ";
2031 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 2);
2032 assert_se(isempty(p
));
2033 assert_se(streq_ptr(a
, "'foobar'"));
2034 assert_se(streq_ptr(b
, "wa\"ld\"i"));
2035 assert_se(streq_ptr(c
, NULL
));
2039 p
= original
= "'foobar' wa\"ld\"i ";
2040 assert_se(extract_many_words(&p
, NULL
, EXTRACT_QUOTES
, &a
, &b
, &c
, NULL
) == 2);
2041 assert_se(isempty(p
));
2042 assert_se(streq_ptr(a
, "foobar"));
2043 assert_se(streq_ptr(b
, "waldi"));
2044 assert_se(streq_ptr(c
, NULL
));
2049 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2050 assert_se(isempty(p
));
2051 assert_se(streq_ptr(a
, NULL
));
2052 assert_se(streq_ptr(b
, NULL
));
2053 assert_se(streq_ptr(c
, NULL
));
2056 assert_se(extract_many_words(&p
, NULL
, 0, &a
, &b
, &c
, NULL
) == 0);
2057 assert_se(isempty(p
));
2058 assert_se(streq_ptr(a
, NULL
));
2059 assert_se(streq_ptr(b
, NULL
));
2060 assert_se(streq_ptr(c
, NULL
));
2062 p
= original
= "foobar";
2063 assert_se(extract_many_words(&p
, NULL
, 0, NULL
) == 0);
2064 assert_se(p
== original
);
2066 p
= original
= "foobar waldi";
2067 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2068 assert_se(p
== original
+7);
2069 assert_se(streq_ptr(a
, "foobar"));
2072 p
= original
= " foobar ";
2073 assert_se(extract_many_words(&p
, NULL
, 0, &a
, NULL
) == 1);
2074 assert_se(isempty(p
));
2075 assert_se(streq_ptr(a
, "foobar"));
2079 static int parse_item(const char *key
, const char *value
) {
2082 log_info("kernel cmdline option <%s> = <%s>", key
, strna(value
));
2086 static void test_parse_proc_cmdline(void) {
2087 assert_se(parse_proc_cmdline(parse_item
) >= 0);
2090 static void test_raw_clone(void) {
2091 pid_t parent
, pid
, pid2
;
2094 log_info("before clone: getpid()→"PID_FMT
, parent
);
2095 assert_se(raw_getpid() == parent
);
2097 pid
= raw_clone(0, NULL
);
2098 assert_se(pid
>= 0);
2100 pid2
= raw_getpid();
2101 log_info("raw_clone: "PID_FMT
" getpid()→"PID_FMT
" raw_getpid()→"PID_FMT
,
2102 pid
, getpid(), pid2
);
2104 assert_se(pid2
!= parent
);
2105 _exit(EXIT_SUCCESS
);
2109 assert_se(pid2
== parent
);
2110 waitpid(pid
, &status
, __WCLONE
);
2111 assert_se(WIFEXITED(status
) && WEXITSTATUS(status
) == EXIT_SUCCESS
);
2115 static void test_same_fd(void) {
2116 _cleanup_close_pair_
int p
[2] = { -1, -1 };
2117 _cleanup_close_
int a
= -1, b
= -1, c
= -1;
2119 assert_se(pipe2(p
, O_CLOEXEC
) >= 0);
2120 assert_se((a
= dup(p
[0])) >= 0);
2121 assert_se((b
= open("/dev/null", O_RDONLY
|O_CLOEXEC
)) >= 0);
2122 assert_se((c
= dup(a
)) >= 0);
2124 assert_se(same_fd(p
[0], p
[0]) > 0);
2125 assert_se(same_fd(p
[1], p
[1]) > 0);
2126 assert_se(same_fd(a
, a
) > 0);
2127 assert_se(same_fd(b
, b
) > 0);
2129 assert_se(same_fd(a
, p
[0]) > 0);
2130 assert_se(same_fd(p
[0], a
) > 0);
2131 assert_se(same_fd(c
, p
[0]) > 0);
2132 assert_se(same_fd(p
[0], c
) > 0);
2133 assert_se(same_fd(a
, c
) > 0);
2134 assert_se(same_fd(c
, a
) > 0);
2136 assert_se(same_fd(p
[0], p
[1]) == 0);
2137 assert_se(same_fd(p
[1], p
[0]) == 0);
2138 assert_se(same_fd(p
[0], b
) == 0);
2139 assert_se(same_fd(b
, p
[0]) == 0);
2140 assert_se(same_fd(p
[1], a
) == 0);
2141 assert_se(same_fd(a
, p
[1]) == 0);
2142 assert_se(same_fd(p
[1], b
) == 0);
2143 assert_se(same_fd(b
, p
[1]) == 0);
2145 assert_se(same_fd(a
, b
) == 0);
2146 assert_se(same_fd(b
, a
) == 0);
2149 static void test_uid_ptr(void) {
2151 assert_se(UID_TO_PTR(0) != NULL
);
2152 assert_se(UID_TO_PTR(1000) != NULL
);
2154 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
2155 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
2158 static void test_sparse_write_one(int fd
, const char *buffer
, size_t n
) {
2161 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2162 assert_se(ftruncate(fd
, 0) >= 0);
2163 assert_se(sparse_write(fd
, buffer
, n
, 4) == (ssize_t
) n
);
2165 assert_se(lseek(fd
, 0, SEEK_CUR
) == (off_t
) n
);
2166 assert_se(ftruncate(fd
, n
) >= 0);
2168 assert_se(lseek(fd
, 0, SEEK_SET
) == 0);
2169 assert_se(read(fd
, check
, n
) == (ssize_t
) n
);
2171 assert_se(memcmp(buffer
, check
, n
) == 0);
2174 static void test_sparse_write(void) {
2175 const char test_a
[] = "test";
2176 const char test_b
[] = "\0\0\0\0test\0\0\0\0";
2177 const char test_c
[] = "\0\0test\0\0\0\0";
2178 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";
2179 const char test_e
[] = "test\0\0\0\0test";
2180 _cleanup_close_
int fd
= -1;
2181 char fn
[] = "/tmp/sparseXXXXXX";
2183 fd
= mkostemp(fn
, O_CLOEXEC
);
2187 test_sparse_write_one(fd
, test_a
, sizeof(test_a
));
2188 test_sparse_write_one(fd
, test_b
, sizeof(test_b
));
2189 test_sparse_write_one(fd
, test_c
, sizeof(test_c
));
2190 test_sparse_write_one(fd
, test_d
, sizeof(test_d
));
2191 test_sparse_write_one(fd
, test_e
, sizeof(test_e
));
2194 static void test_shell_escape_one(const char *s
, const char *bad
, const char *expected
) {
2195 _cleanup_free_
char *r
;
2197 assert_se(r
= shell_escape(s
, bad
));
2198 assert_se(streq_ptr(r
, expected
));
2201 static void test_shell_escape(void) {
2202 test_shell_escape_one("", "", "");
2203 test_shell_escape_one("\\", "", "\\\\");
2204 test_shell_escape_one("foobar", "", "foobar");
2205 test_shell_escape_one("foobar", "o", "f\\o\\obar");
2206 test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
2209 static void test_shell_maybe_quote_one(const char *s
, const char *expected
) {
2210 _cleanup_free_
char *r
;
2212 assert_se(r
= shell_maybe_quote(s
));
2213 assert_se(streq(r
, expected
));
2216 static void test_shell_maybe_quote(void) {
2218 test_shell_maybe_quote_one("", "");
2219 test_shell_maybe_quote_one("\\", "\"\\\\\"");
2220 test_shell_maybe_quote_one("\"", "\"\\\"\"");
2221 test_shell_maybe_quote_one("foobar", "foobar");
2222 test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
2223 test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
2224 test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
2227 static void test_parse_mode(void) {
2230 assert_se(parse_mode("-1", &m
) < 0);
2231 assert_se(parse_mode("", &m
) < 0);
2232 assert_se(parse_mode("888", &m
) < 0);
2233 assert_se(parse_mode("77777", &m
) < 0);
2235 assert_se(parse_mode("544", &m
) >= 0 && m
== 0544);
2236 assert_se(parse_mode("777", &m
) >= 0 && m
== 0777);
2237 assert_se(parse_mode("7777", &m
) >= 0 && m
== 07777);
2238 assert_se(parse_mode("0", &m
) >= 0 && m
== 0);
2241 static void test_tempfn(void) {
2242 char *ret
= NULL
, *p
;
2244 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL
, &ret
) >= 0);
2245 assert_se(streq_ptr(ret
, "/foo/bar/.#waldoXXXXXX"));
2248 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret
) >= 0);
2249 assert_se(streq_ptr(ret
, "/foo/bar/.#[miau]waldoXXXXXX"));
2252 assert_se(tempfn_random("/foo/bar/waldo", NULL
, &ret
) >= 0);
2253 assert_se(p
= startswith(ret
, "/foo/bar/.#waldo"));
2254 assert_se(strlen(p
) == 16);
2255 assert_se(in_charset(p
, "0123456789abcdef"));
2258 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret
) >= 0);
2259 assert_se(p
= startswith(ret
, "/foo/bar/.#[wuff]waldo"));
2260 assert_se(strlen(p
) == 16);
2261 assert_se(in_charset(p
, "0123456789abcdef"));
2264 assert_se(tempfn_random_child("/foo/bar/waldo", NULL
, &ret
) >= 0);
2265 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#"));
2266 assert_se(strlen(p
) == 16);
2267 assert_se(in_charset(p
, "0123456789abcdef"));
2270 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret
) >= 0);
2271 assert_se(p
= startswith(ret
, "/foo/bar/waldo/.#[kikiriki]"));
2272 assert_se(strlen(p
) == 16);
2273 assert_se(in_charset(p
, "0123456789abcdef"));
2277 static void test_strcmp_ptr(void) {
2278 assert_se(strcmp_ptr(NULL
, NULL
) == 0);
2279 assert_se(strcmp_ptr("", NULL
) > 0);
2280 assert_se(strcmp_ptr("foo", NULL
) > 0);
2281 assert_se(strcmp_ptr(NULL
, "") < 0);
2282 assert_se(strcmp_ptr(NULL
, "bar") < 0);
2283 assert_se(strcmp_ptr("foo", "bar") > 0);
2284 assert_se(strcmp_ptr("bar", "baz") < 0);
2285 assert_se(strcmp_ptr("foo", "foo") == 0);
2286 assert_se(strcmp_ptr("", "") == 0);
2289 static void test_fgetxattrat_fake(void) {
2290 char t
[] = "/var/tmp/xattrtestXXXXXX";
2291 _cleanup_close_
int fd
= -1;
2296 assert_se(mkdtemp(t
));
2297 x
= strjoina(t
, "/test");
2298 assert_se(touch(x
) >= 0);
2300 r
= setxattr(x
, "user.foo", "bar", 3, 0);
2301 if (r
< 0 && errno
== EOPNOTSUPP
) /* no xattrs supported on /var/tmp... */
2305 fd
= open(t
, O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2308 assert_se(fgetxattrat_fake(fd
, "test", "user.foo", v
, 3, 0) >= 0);
2309 assert_se(memcmp(v
, "bar", 3) == 0);
2312 fd
= open("/", O_RDONLY
|O_DIRECTORY
|O_CLOEXEC
|O_NOCTTY
);
2314 assert_se(fgetxattrat_fake(fd
, "usr", "user.idontexist", v
, 3, 0) == -ENODATA
);
2317 assert_se(unlink(x
) >= 0);
2318 assert_se(rmdir(t
) >= 0);
2321 int main(int argc
, char *argv
[]) {
2322 log_parse_environment();
2326 test_align_power2();
2328 test_container_of();
2330 test_div_round_up();
2333 test_parse_boolean();
2342 test_delete_chars();
2346 test_base32hexchar();
2347 test_unbase32hexchar();
2349 test_unbase64char();
2355 test_base32hexmem();
2356 test_unbase32hexmem();
2361 test_foreach_word();
2362 test_foreach_word_quoted();
2363 test_memdup_multiply();
2365 test_protect_errno();
2367 test_parse_cpu_set();
2368 test_config_parse_iec_uint64();
2372 test_fstab_node_to_udev_node();
2373 test_get_files_in_directory();
2375 test_writing_tmpfile();
2378 test_foreach_string();
2379 test_filename_is_valid();
2380 test_string_has_cc();
2381 test_ascii_strlower();
2383 test_is_valid_documentation_url();
2384 test_file_in_same_dir();
2386 test_endswith_no_case();
2387 test_close_nointr();
2388 test_unlink_noerrno();
2389 test_readlink_and_make_absolute();
2390 test_ignore_signals();
2394 test_search_and_fopen();
2395 test_search_and_fopen_nulstr();
2397 test_execute_directory();
2398 test_extract_first_word();
2399 test_extract_first_word_and_warn();
2400 test_extract_many_words();
2401 test_parse_proc_cmdline();
2405 test_sparse_write();
2406 test_shell_escape();
2407 test_shell_maybe_quote();
2411 test_fgetxattrat_fake();