]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-glob-util.c
tree-wide: use -EBADF for fd initialization
[thirdparty/systemd.git] / src / test / test-glob-util.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
6a4f4a0f
RC
2
3#include <fcntl.h>
48d7c648 4#include <sys/stat.h>
6a4f4a0f
RC
5#include <unistd.h>
6
7#include "alloc-util.h"
48d7c648 8#include "dirent-util.h"
48d7c648 9#include "fs-util.h"
6a4f4a0f
RC
10#include "glob-util.h"
11#include "macro.h"
48d7c648 12#include "rm-rf.h"
4f7452a8 13#include "tests.h"
e4de7287 14#include "tmpfile-util.h"
6a4f4a0f 15
f52faaf9
LB
16TEST(glob_first) {
17 char *first, name[] = "/tmp/test-glob_first.XXXXXX";
254d1313 18 int fd = -EBADF;
f52faaf9
LB
19 int r;
20
21 fd = mkostemp_safe(name);
22 assert_se(fd >= 0);
23 close(fd);
24
25 r = glob_first("/tmp/test-glob_first*", &first);
26 assert_se(r == 1);
27 assert_se(streq(name, first));
28 first = mfree(first);
29
30 r = unlink(name);
31 assert_se(r == 0);
32 r = glob_first("/tmp/test-glob_first*", &first);
33 assert_se(r == 0);
34 assert_se(first == NULL);
35}
36
4f7452a8 37TEST(glob_exists) {
6a4f4a0f 38 char name[] = "/tmp/test-glob_exists.XXXXXX";
254d1313 39 int fd = -EBADF;
6a4f4a0f
RC
40 int r;
41
646853bd 42 fd = mkostemp_safe(name);
6a4f4a0f
RC
43 assert_se(fd >= 0);
44 close(fd);
45
46 r = glob_exists("/tmp/test-glob_exists*");
47 assert_se(r == 1);
48
49 r = unlink(name);
50 assert_se(r == 0);
51 r = glob_exists("/tmp/test-glob_exists*");
52 assert_se(r == 0);
53}
54
46dcfbbd 55static void closedir_wrapper(void* v) {
1fe10174
ZJS
56 (void) closedir(v);
57}
58
4f7452a8 59TEST(glob_no_dot) {
48d7c648
ZJS
60 char template[] = "/tmp/test-glob-util.XXXXXXX";
61 const char *fn;
62
63 _cleanup_globfree_ glob_t g = {
46dcfbbd 64 .gl_closedir = closedir_wrapper,
48d7c648
ZJS
65 .gl_readdir = (struct dirent *(*)(void *)) readdir_no_dot,
66 .gl_opendir = (void *(*)(const char *)) opendir,
67 .gl_lstat = lstat,
68 .gl_stat = stat,
69 };
70
71 int r;
72
73 assert_se(mkdtemp(template));
74
75 fn = strjoina(template, "/*");
76 r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
77 assert_se(r == GLOB_NOMATCH);
78
79 fn = strjoina(template, "/.*");
80 r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
81 assert_se(r == GLOB_NOMATCH);
82
83 (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL);
84}
85
4f7452a8 86TEST(safe_glob) {
48d7c648
ZJS
87 char template[] = "/tmp/test-glob-util.XXXXXXX";
88 const char *fn, *fn2, *fname;
89
90 _cleanup_globfree_ glob_t g = {};
91 int r;
92
93 assert_se(mkdtemp(template));
94
95 fn = strjoina(template, "/*");
96 r = safe_glob(fn, 0, &g);
97 assert_se(r == -ENOENT);
98
99 fn2 = strjoina(template, "/.*");
100 r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g);
101 assert_se(r == -ENOENT);
102
103 fname = strjoina(template, "/.foobar");
104 assert_se(touch(fname) == 0);
105
106 r = safe_glob(fn, 0, &g);
107 assert_se(r == -ENOENT);
108
109 r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g);
110 assert_se(r == 0);
111 assert_se(g.gl_pathc == 1);
112 assert_se(streq(g.gl_pathv[0], fname));
113 assert_se(g.gl_pathv[1] == NULL);
114
115 (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL);
116}
117
1e472a6c
ZJS
118static void test_glob_non_glob_prefix_one(const char *path, const char *expected) {
119 _cleanup_free_ char *t;
120
121 assert_se(glob_non_glob_prefix(path, &t) == 0);
122 assert_se(streq(t, expected));
123}
124
4f7452a8 125TEST(glob_non_glob) {
1e472a6c
ZJS
126 test_glob_non_glob_prefix_one("/tmp/.X11-*", "/tmp/");
127 test_glob_non_glob_prefix_one("/tmp/*", "/tmp/");
128 test_glob_non_glob_prefix_one("/tmp*", "/");
129 test_glob_non_glob_prefix_one("/tmp/*/whatever", "/tmp/");
130 test_glob_non_glob_prefix_one("/tmp/*/whatever?", "/tmp/");
131 test_glob_non_glob_prefix_one("/?", "/");
132
133 char *x;
134 assert_se(glob_non_glob_prefix("?", &x) == -ENOENT);
135}
136
4f7452a8 137DEFINE_TEST_MAIN(LOG_INFO);