Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include <fcntl.h>
4 : : #include <glob.h>
5 : : #include <sys/stat.h>
6 : : #include <unistd.h>
7 : :
8 : : #include "alloc-util.h"
9 : : #include "dirent-util.h"
10 : : #include "fs-util.h"
11 : : #include "glob-util.h"
12 : : #include "macro.h"
13 : : #include "rm-rf.h"
14 : : #include "tmpfile-util.h"
15 : :
16 : 4 : static void test_glob_exists(void) {
17 : 4 : char name[] = "/tmp/test-glob_exists.XXXXXX";
18 : 4 : int fd = -1;
19 : : int r;
20 : :
21 : 4 : fd = mkostemp_safe(name);
22 [ - + ]: 4 : assert_se(fd >= 0);
23 : 4 : close(fd);
24 : :
25 : 4 : r = glob_exists("/tmp/test-glob_exists*");
26 [ - + ]: 4 : assert_se(r == 1);
27 : :
28 : 4 : r = unlink(name);
29 [ - + ]: 4 : assert_se(r == 0);
30 : 4 : r = glob_exists("/tmp/test-glob_exists*");
31 [ - + ]: 4 : assert_se(r == 0);
32 : 4 : }
33 : :
34 : 8 : static void closedir_wrapper(void* v) {
35 : 8 : (void) closedir(v);
36 : 8 : }
37 : :
38 : 4 : static void test_glob_no_dot(void) {
39 : 4 : char template[] = "/tmp/test-glob-util.XXXXXXX";
40 : : const char *fn;
41 : :
42 : 4 : _cleanup_globfree_ glob_t g = {
43 : : .gl_closedir = closedir_wrapper,
44 : : .gl_readdir = (struct dirent *(*)(void *)) readdir_no_dot,
45 : : .gl_opendir = (void *(*)(const char *)) opendir,
46 : : .gl_lstat = lstat,
47 : : .gl_stat = stat,
48 : : };
49 : :
50 : : int r;
51 : :
52 [ - + ]: 4 : assert_se(mkdtemp(template));
53 : :
54 [ + + + - : 20 : fn = strjoina(template, "/*");
- + - + +
+ + - ]
55 : 4 : r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
56 [ - + ]: 4 : assert_se(r == GLOB_NOMATCH);
57 : :
58 [ + + + - : 20 : fn = strjoina(template, "/.*");
- + - + +
+ + - ]
59 : 4 : r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
60 [ - + ]: 4 : assert_se(r == GLOB_NOMATCH);
61 : :
62 : 4 : (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL);
63 : 4 : }
64 : :
65 : 4 : static void test_safe_glob(void) {
66 : 4 : char template[] = "/tmp/test-glob-util.XXXXXXX";
67 : : const char *fn, *fn2, *fname;
68 : :
69 : 4 : _cleanup_globfree_ glob_t g = {};
70 : : int r;
71 : :
72 [ - + ]: 4 : assert_se(mkdtemp(template));
73 : :
74 [ + + + - : 20 : fn = strjoina(template, "/*");
- + - + +
+ + - ]
75 : 4 : r = safe_glob(fn, 0, &g);
76 [ - + ]: 4 : assert_se(r == -ENOENT);
77 : :
78 [ + + + - : 20 : fn2 = strjoina(template, "/.*");
- + - + +
+ + - ]
79 : 4 : r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g);
80 [ - + ]: 4 : assert_se(r == -ENOENT);
81 : :
82 [ + + + - : 20 : fname = strjoina(template, "/.foobar");
- + - + +
+ + - ]
83 [ - + ]: 4 : assert_se(touch(fname) == 0);
84 : :
85 : 4 : r = safe_glob(fn, 0, &g);
86 [ - + ]: 4 : assert_se(r == -ENOENT);
87 : :
88 : 4 : r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g);
89 [ - + ]: 4 : assert_se(r == 0);
90 [ - + ]: 4 : assert_se(g.gl_pathc == 1);
91 [ - + ]: 4 : assert_se(streq(g.gl_pathv[0], fname));
92 [ - + ]: 4 : assert_se(g.gl_pathv[1] == NULL);
93 : :
94 : 4 : (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL);
95 : 4 : }
96 : :
97 : 4 : int main(void) {
98 : 4 : test_glob_exists();
99 : 4 : test_glob_no_dot();
100 : 4 : test_safe_glob();
101 : :
102 : 4 : return 0;
103 : : }
|