2 This file is part of systemd.
4 Copyright 2010 Lennart Poettering
5 Copyright 2013 Thomas H.P. Andersen
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <sys/types.h>
27 #include <sys/xattr.h>
30 #include "alloc-util.h"
31 #include "conf-parser.h"
36 #include "fstab-util.h"
37 #include "glob-util.h"
40 #include "parse-util.h"
41 #include "path-util.h"
42 #include "proc-cmdline.h"
43 #include "process-util.h"
45 #include "signal-util.h"
47 #include "stat-util.h"
48 #include "string-util.h"
50 #include "user-util.h"
53 #include "xattr-util.h"
55 static void test_align_power2(void) {
58 assert_se(ALIGN_POWER2(0) == 0);
59 assert_se(ALIGN_POWER2(1) == 1);
60 assert_se(ALIGN_POWER2(2) == 2);
61 assert_se(ALIGN_POWER2(3) == 4);
62 assert_se(ALIGN_POWER2(12) == 16);
64 assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
65 assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
66 assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
67 assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
68 assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
70 for (i = 1; i < 131071; ++i) {
71 for (p2 = 1; p2 < i; p2 <<= 1)
74 assert_se(ALIGN_POWER2(i) == p2);
77 for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
78 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
81 assert_se(ALIGN_POWER2(i) == p2);
85 static void test_max(void) {
88 int b[CONST_MAX(10, 100)];
90 .a = CONST_MAX(10, 100),
94 assert_cc(sizeof(val1.b) == sizeof(int) * 100);
96 /* CONST_MAX returns (void) instead of a value if the passed arguments
97 * are not of the same type or not constant expressions. */
98 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
99 assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
101 assert_se(val1.a == 100);
102 assert_se(MAX(++d, 0) == 1);
105 assert_cc(MAXSIZE(char[3], uint16_t) == 3);
106 assert_cc(MAXSIZE(char[3], uint32_t) == 4);
107 assert_cc(MAXSIZE(char, long) == sizeof(long));
109 assert_se(MAX(-5, 5) == 5);
110 assert_se(MAX(5, 5) == 5);
111 assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
112 assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
113 assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
114 assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
115 assert_se(LESS_BY(8, 4) == 4);
116 assert_se(LESS_BY(8, 8) == 0);
117 assert_se(LESS_BY(4, 8) == 0);
118 assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
119 assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
120 assert_se(CLAMP(-5, 0, 1) == 0);
121 assert_se(CLAMP(5, 0, 1) == 1);
122 assert_se(CLAMP(5, -10, 1) == 1);
123 assert_se(CLAMP(5, -10, 10) == 5);
124 assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
127 static void test_container_of(void) {
133 } _packed_ myval = { };
135 assert_cc(sizeof(myval) == 17);
136 assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
137 assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
138 assert_se(container_of(&container_of(&myval.v2,
145 static void test_div_round_up(void) {
149 assert_se(DIV_ROUND_UP(0, 8) == 0);
150 assert_se(DIV_ROUND_UP(1, 8) == 1);
151 assert_se(DIV_ROUND_UP(8, 8) == 1);
152 assert_se(DIV_ROUND_UP(12, 8) == 2);
153 assert_se(DIV_ROUND_UP(16, 8) == 2);
155 /* test multiple evaluation */
157 assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
158 assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
159 assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
160 assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
162 /* overflow test with exact division */
163 assert_se(sizeof(0U) == 4);
164 assert_se(0xfffffffaU % 10U == 0U);
165 assert_se(0xfffffffaU / 10U == 429496729U);
166 assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
167 assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
168 assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
170 /* overflow test with rounded division */
171 assert_se(0xfffffffdU % 10U == 3U);
172 assert_se(0xfffffffdU / 10U == 429496729U);
173 assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
174 assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
175 assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
178 static void test_close_many(void) {
180 char name0[] = "/tmp/test-close-many.XXXXXX";
181 char name1[] = "/tmp/test-close-many.XXXXXX";
182 char name2[] = "/tmp/test-close-many.XXXXXX";
184 fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
185 fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
186 fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
190 assert_se(fcntl(fds[0], F_GETFD) == -1);
191 assert_se(fcntl(fds[1], F_GETFD) == -1);
192 assert_se(fcntl(fds[2], F_GETFD) >= 0);
201 static void test_parse_uid(void) {
205 r = parse_uid("100", &uid);
207 assert_se(uid == 100);
209 r = parse_uid("65535", &uid);
210 assert_se(r == -ENXIO);
212 r = parse_uid("asdsdas", &uid);
213 assert_se(r == -EINVAL);
216 static void test_u64log2(void) {
217 assert_se(u64log2(0) == 0);
218 assert_se(u64log2(8) == 3);
219 assert_se(u64log2(9) == 3);
220 assert_se(u64log2(15) == 3);
221 assert_se(u64log2(16) == 4);
222 assert_se(u64log2(1024*1024) == 20);
223 assert_se(u64log2(1024*1024+5) == 20);
226 static void test_protect_errno(void) {
232 assert_se(errno == 12);
235 static void test_config_parse_iec_uint64(void) {
237 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
238 assert_se(offset == 4 * 1024 * 1024);
240 assert_se(config_parse_iec_uint64(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
243 static void test_fstab_node_to_udev_node(void) {
246 n = fstab_node_to_udev_node("LABEL=applé/jack");
248 assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
251 n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
253 assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
256 n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
258 assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
261 n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
263 assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
266 n = fstab_node_to_udev_node("PONIES=awesome");
268 assert_se(streq(n, "PONIES=awesome"));
271 n = fstab_node_to_udev_node("/dev/xda1");
273 assert_se(streq(n, "/dev/xda1"));
277 static void test_get_files_in_directory(void) {
278 _cleanup_strv_free_ char **l = NULL, **t = NULL;
280 assert_se(get_files_in_directory("/tmp", &l) >= 0);
281 assert_se(get_files_in_directory(".", &t) >= 0);
282 assert_se(get_files_in_directory(".", NULL) >= 0);
285 static void test_in_set(void) {
286 assert_se(IN_SET(1, 1));
287 assert_se(IN_SET(1, 1, 2, 3, 4));
288 assert_se(IN_SET(2, 1, 2, 3, 4));
289 assert_se(IN_SET(3, 1, 2, 3, 4));
290 assert_se(IN_SET(4, 1, 2, 3, 4));
291 assert_se(!IN_SET(0, 1));
292 assert_se(!IN_SET(0, 1, 2, 3, 4));
295 static void test_writing_tmpfile(void) {
296 char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
297 _cleanup_free_ char *contents = NULL;
302 IOVEC_SET_STRING(iov[0], "abc\n");
303 IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
304 IOVEC_SET_STRING(iov[2], "");
306 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
307 printf("tmpfile: %s", name);
309 r = writev(fd, iov, 3);
312 r = read_full_file(name, &contents, &size);
314 printf("contents: %s", contents);
315 assert_se(streq(contents, "abc\n" ALPHANUMERICAL "\n"));
320 static void test_log2i(void) {
321 assert_se(log2i(1) == 0);
322 assert_se(log2i(2) == 1);
323 assert_se(log2i(3) == 1);
324 assert_se(log2i(4) == 2);
325 assert_se(log2i(32) == 5);
326 assert_se(log2i(33) == 5);
327 assert_se(log2i(63) == 5);
328 assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
331 static void test_filename_is_valid(void) {
332 char foo[FILENAME_MAX+2];
335 assert_se(!filename_is_valid(""));
336 assert_se(!filename_is_valid("/bar/foo"));
337 assert_se(!filename_is_valid("/"));
338 assert_se(!filename_is_valid("."));
339 assert_se(!filename_is_valid(".."));
341 for (i=0; i<FILENAME_MAX+1; i++)
343 foo[FILENAME_MAX+1] = '\0';
345 assert_se(!filename_is_valid(foo));
347 assert_se(filename_is_valid("foo_bar-333"));
348 assert_se(filename_is_valid("o.o"));
351 static void test_files_same(void) {
352 _cleanup_close_ int fd = -1;
353 char name[] = "/tmp/test-files_same.XXXXXX";
354 char name_alias[] = "/tmp/test-files_same.alias";
356 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
358 assert_se(symlink(name, name_alias) >= 0);
360 assert_se(files_same(name, name));
361 assert_se(files_same(name, name_alias));
367 static void test_file_in_same_dir(void) {
370 t = file_in_same_dir("/", "a");
371 assert_se(streq(t, "/a"));
374 t = file_in_same_dir("/", "/a");
375 assert_se(streq(t, "/a"));
378 t = file_in_same_dir("", "a");
379 assert_se(streq(t, "a"));
382 t = file_in_same_dir("a/", "a");
383 assert_se(streq(t, "a/a"));
386 t = file_in_same_dir("bar/foo", "bar");
387 assert_se(streq(t, "bar/bar"));
391 static void test_close_nointr(void) {
392 char name[] = "/tmp/test-test-close_nointr.XXXXXX";
395 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
397 assert_se(close_nointr(fd) >= 0);
398 assert_se(close_nointr(fd) < 0);
404 static void test_unlink_noerrno(void) {
405 char name[] = "/tmp/test-close_nointr.XXXXXX";
408 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
410 assert_se(close_nointr(fd) >= 0);
415 assert_se(unlink_noerrno(name) >= 0);
416 assert_se(errno == -42);
417 assert_se(unlink_noerrno(name) < 0);
418 assert_se(errno == -42);
422 static void test_readlink_and_make_absolute(void) {
423 char tempdir[] = "/tmp/test-readlink_and_make_absolute";
424 char name[] = "/tmp/test-readlink_and_make_absolute/original";
425 char name2[] = "test-readlink_and_make_absolute/original";
426 char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
429 assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
430 assert_se(touch(name) >= 0);
432 assert_se(symlink(name, name_alias) >= 0);
433 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
434 assert_se(streq(r, name));
436 assert_se(unlink(name_alias) >= 0);
438 assert_se(chdir(tempdir) >= 0);
439 assert_se(symlink(name2, name_alias) >= 0);
440 assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
441 assert_se(streq(r, name));
443 assert_se(unlink(name_alias) >= 0);
445 assert_se(rm_rf(tempdir, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
448 static void test_ignore_signals(void) {
449 assert_se(ignore_signals(SIGINT, -1) >= 0);
450 assert_se(kill(getpid(), SIGINT) >= 0);
451 assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
452 assert_se(kill(getpid(), SIGUSR1) >= 0);
453 assert_se(kill(getpid(), SIGUSR2) >= 0);
454 assert_se(kill(getpid(), SIGTERM) >= 0);
455 assert_se(kill(getpid(), SIGPIPE) >= 0);
456 assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
459 static void test_is_symlink(void) {
460 char name[] = "/tmp/test-is_symlink.XXXXXX";
461 char name_link[] = "/tmp/test-is_symlink.link";
462 _cleanup_close_ int fd = -1;
464 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
466 assert_se(symlink(name, name_link) >= 0);
468 assert_se(is_symlink(name) == 0);
469 assert_se(is_symlink(name_link) == 1);
470 assert_se(is_symlink("/a/file/which/does/not/exist/i/guess") < 0);
477 static void test_search_and_fopen(void) {
478 const char *dirs[] = {"/tmp/foo/bar", "/tmp", NULL};
479 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
484 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
488 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
492 r = search_and_fopen(name, "r", NULL, dirs, &f);
496 r = search_and_fopen(basename(name), "r", "/", dirs, &f);
500 r = search_and_fopen("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
502 r = search_and_fopen("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
508 r = search_and_fopen(basename(name), "r", NULL, dirs, &f);
513 static void test_search_and_fopen_nulstr(void) {
514 const char dirs[] = "/tmp/foo/bar\0/tmp\0";
515 char name[] = "/tmp/test-search_and_fopen.XXXXXX";
520 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
524 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
528 r = search_and_fopen_nulstr(name, "r", NULL, dirs, &f);
532 r = search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "r", NULL, dirs, &f);
534 r = search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "r", NULL, dirs, &f);
540 r = search_and_fopen_nulstr(basename(name), "r", NULL, dirs, &f);
544 static void test_glob_exists(void) {
545 char name[] = "/tmp/test-glob_exists.XXXXXX";
549 fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
553 r = glob_exists("/tmp/test-glob_exists*");
558 r = glob_exists("/tmp/test-glob_exists*");
562 static void test_execute_directory(void) {
563 char template_lo[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
564 char template_hi[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
565 const char * dirs[] = {template_hi, template_lo, NULL};
566 const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
568 assert_se(mkdtemp(template_lo));
569 assert_se(mkdtemp(template_hi));
571 name = strjoina(template_lo, "/script");
572 name2 = strjoina(template_hi, "/script2");
573 name3 = strjoina(template_lo, "/useless");
574 overridden = strjoina(template_lo, "/overridden");
575 override = strjoina(template_hi, "/overridden");
576 masked = strjoina(template_lo, "/masked");
577 mask = strjoina(template_hi, "/masked");
579 assert_se(write_string_file(name, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE) == 0);
580 assert_se(write_string_file(name2, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE) == 0);
581 assert_se(write_string_file(overridden, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
582 assert_se(write_string_file(override, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE) == 0);
583 assert_se(write_string_file(masked, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
584 assert_se(symlink("/dev/null", mask) == 0);
585 assert_se(chmod(name, 0755) == 0);
586 assert_se(chmod(name2, 0755) == 0);
587 assert_se(chmod(overridden, 0755) == 0);
588 assert_se(chmod(override, 0755) == 0);
589 assert_se(chmod(masked, 0755) == 0);
590 assert_se(touch(name3) >= 0);
592 execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL);
594 assert_se(chdir(template_lo) == 0);
595 assert_se(access("it_works", F_OK) >= 0);
596 assert_se(access("failed", F_OK) < 0);
598 assert_se(chdir(template_hi) == 0);
599 assert_se(access("it_works2", F_OK) >= 0);
600 assert_se(access("failed", F_OK) < 0);
602 (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
603 (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
606 static int parse_item(const char *key, const char *value) {
609 log_info("kernel cmdline option <%s> = <%s>", key, strna(value));
613 static void test_parse_proc_cmdline(void) {
614 assert_se(parse_proc_cmdline(parse_item) >= 0);
617 static void test_raw_clone(void) {
618 pid_t parent, pid, pid2;
621 log_info("before clone: getpid()→"PID_FMT, parent);
622 assert_se(raw_getpid() == parent);
624 pid = raw_clone(0, NULL);
628 log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
629 pid, getpid(), pid2);
631 assert_se(pid2 != parent);
636 assert_se(pid2 == parent);
637 waitpid(pid, &status, __WCLONE);
638 assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
642 static void test_same_fd(void) {
643 _cleanup_close_pair_ int p[2] = { -1, -1 };
644 _cleanup_close_ int a = -1, b = -1, c = -1;
646 assert_se(pipe2(p, O_CLOEXEC) >= 0);
647 assert_se((a = dup(p[0])) >= 0);
648 assert_se((b = open("/dev/null", O_RDONLY|O_CLOEXEC)) >= 0);
649 assert_se((c = dup(a)) >= 0);
651 assert_se(same_fd(p[0], p[0]) > 0);
652 assert_se(same_fd(p[1], p[1]) > 0);
653 assert_se(same_fd(a, a) > 0);
654 assert_se(same_fd(b, b) > 0);
656 assert_se(same_fd(a, p[0]) > 0);
657 assert_se(same_fd(p[0], a) > 0);
658 assert_se(same_fd(c, p[0]) > 0);
659 assert_se(same_fd(p[0], c) > 0);
660 assert_se(same_fd(a, c) > 0);
661 assert_se(same_fd(c, a) > 0);
663 assert_se(same_fd(p[0], p[1]) == 0);
664 assert_se(same_fd(p[1], p[0]) == 0);
665 assert_se(same_fd(p[0], b) == 0);
666 assert_se(same_fd(b, p[0]) == 0);
667 assert_se(same_fd(p[1], a) == 0);
668 assert_se(same_fd(a, p[1]) == 0);
669 assert_se(same_fd(p[1], b) == 0);
670 assert_se(same_fd(b, p[1]) == 0);
672 assert_se(same_fd(a, b) == 0);
673 assert_se(same_fd(b, a) == 0);
676 static void test_uid_ptr(void) {
678 assert_se(UID_TO_PTR(0) != NULL);
679 assert_se(UID_TO_PTR(1000) != NULL);
681 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
682 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
685 static void test_sparse_write_one(int fd, const char *buffer, size_t n) {
688 assert_se(lseek(fd, 0, SEEK_SET) == 0);
689 assert_se(ftruncate(fd, 0) >= 0);
690 assert_se(sparse_write(fd, buffer, n, 4) == (ssize_t) n);
692 assert_se(lseek(fd, 0, SEEK_CUR) == (off_t) n);
693 assert_se(ftruncate(fd, n) >= 0);
695 assert_se(lseek(fd, 0, SEEK_SET) == 0);
696 assert_se(read(fd, check, n) == (ssize_t) n);
698 assert_se(memcmp(buffer, check, n) == 0);
701 static void test_sparse_write(void) {
702 const char test_a[] = "test";
703 const char test_b[] = "\0\0\0\0test\0\0\0\0";
704 const char test_c[] = "\0\0test\0\0\0\0";
705 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";
706 const char test_e[] = "test\0\0\0\0test";
707 _cleanup_close_ int fd = -1;
708 char fn[] = "/tmp/sparseXXXXXX";
710 fd = mkostemp(fn, O_CLOEXEC);
714 test_sparse_write_one(fd, test_a, sizeof(test_a));
715 test_sparse_write_one(fd, test_b, sizeof(test_b));
716 test_sparse_write_one(fd, test_c, sizeof(test_c));
717 test_sparse_write_one(fd, test_d, sizeof(test_d));
718 test_sparse_write_one(fd, test_e, sizeof(test_e));
721 static void test_tempfn(void) {
722 char *ret = NULL, *p;
724 assert_se(tempfn_xxxxxx("/foo/bar/waldo", NULL, &ret) >= 0);
725 assert_se(streq_ptr(ret, "/foo/bar/.#waldoXXXXXX"));
728 assert_se(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret) >= 0);
729 assert_se(streq_ptr(ret, "/foo/bar/.#[miau]waldoXXXXXX"));
732 assert_se(tempfn_random("/foo/bar/waldo", NULL, &ret) >= 0);
733 assert_se(p = startswith(ret, "/foo/bar/.#waldo"));
734 assert_se(strlen(p) == 16);
735 assert_se(in_charset(p, "0123456789abcdef"));
738 assert_se(tempfn_random("/foo/bar/waldo", "[wuff]", &ret) >= 0);
739 assert_se(p = startswith(ret, "/foo/bar/.#[wuff]waldo"));
740 assert_se(strlen(p) == 16);
741 assert_se(in_charset(p, "0123456789abcdef"));
744 assert_se(tempfn_random_child("/foo/bar/waldo", NULL, &ret) >= 0);
745 assert_se(p = startswith(ret, "/foo/bar/waldo/.#"));
746 assert_se(strlen(p) == 16);
747 assert_se(in_charset(p, "0123456789abcdef"));
750 assert_se(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret) >= 0);
751 assert_se(p = startswith(ret, "/foo/bar/waldo/.#[kikiriki]"));
752 assert_se(strlen(p) == 16);
753 assert_se(in_charset(p, "0123456789abcdef"));
757 static void test_fgetxattrat_fake(void) {
758 char t[] = "/var/tmp/xattrtestXXXXXX";
759 _cleanup_close_ int fd = -1;
764 assert_se(mkdtemp(t));
765 x = strjoina(t, "/test");
766 assert_se(touch(x) >= 0);
768 r = setxattr(x, "user.foo", "bar", 3, 0);
769 if (r < 0 && errno == EOPNOTSUPP) /* no xattrs supported on /var/tmp... */
773 fd = open(t, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY);
776 assert_se(fgetxattrat_fake(fd, "test", "user.foo", v, 3, 0) >= 0);
777 assert_se(memcmp(v, "bar", 3) == 0);
780 fd = open("/", O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOCTTY);
782 assert_se(fgetxattrat_fake(fd, "usr", "user.idontexist", v, 3, 0) == -ENODATA);
785 assert_se(unlink(x) >= 0);
786 assert_se(rmdir(t) >= 0);
789 static void test_runlevel_to_target(void) {
790 assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
791 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
792 assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
795 int main(int argc, char *argv[]) {
796 log_parse_environment();
806 test_protect_errno();
807 test_config_parse_iec_uint64();
808 test_fstab_node_to_udev_node();
809 test_get_files_in_directory();
811 test_writing_tmpfile();
813 test_filename_is_valid();
815 test_file_in_same_dir();
817 test_unlink_noerrno();
818 test_readlink_and_make_absolute();
819 test_ignore_signals();
821 test_search_and_fopen();
822 test_search_and_fopen_nulstr();
824 test_execute_directory();
825 test_parse_proc_cmdline();
831 test_fgetxattrat_fake();
832 test_runlevel_to_target();