]>
git.saurik.com Git - apple/libc.git/blob - tests/netbsd_glob.c
1 /* $NetBSD: t_glob.c,v 1.5 2017/01/14 20:47:41 christos Exp $ */
3 * Copyright (c) 2010 The NetBSD Foundation, Inc.
6 * This code is derived from software contributed to The NetBSD Foundation
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include <sys/cdefs.h>
35 __RCSID("$NetBSD: t_glob.c,v 1.5 2017/01/14 20:47:41 christos Exp $");
37 #include <sys/param.h>
47 #include <darwintest.h>
49 #define __arraycount(__x) (sizeof(__x) / sizeof(__x[0]))
52 #define DPRINTF(a) printf a
62 static struct gl_file a
[] = {
69 static struct gl_file b
[] = {
77 const char *name
; /* directory name */
78 const struct gl_file
*dir
;
82 static struct gl_dir d
[] = {
83 { "a", a
, __arraycount(a
), 0 },
84 { "a/b", b
, __arraycount(b
), 0 },
88 static const char *glob_star
[] = {
89 "a/1", "a/3", "a/4", "a/b", "a/b/w", "a/b/x", "a/b/y", "a/b/z",
93 static const char *glob_star_not
[] = {
94 "a/1", "a/3", "a/4", "a/b",
98 trim(char *buf
, size_t len
, const char *name
)
100 char *path
= buf
, *epath
= buf
+ len
;
101 while (path
< epath
&& (*path
++ = *name
++) != '\0')
104 while (path
> buf
&& *--path
== '/')
109 gl_opendir(const char *dir
)
112 char buf
[MAXPATHLEN
];
113 trim(buf
, sizeof(buf
), dir
);
115 for (i
= 0; i
< __arraycount(d
); i
++)
116 if (strcmp(buf
, d
[i
].name
) == 0) {
117 DPRINTF(("opendir %s %zu\n", buf
, i
));
124 static struct dirent
*
127 static struct dirent dir
;
128 struct gl_dir
*dd
= v
;
129 if (dd
->pos
< dd
->len
) {
130 const struct gl_file
*f
= &dd
->dir
[dd
->pos
++];
131 strcpy(dir
.d_name
, f
->name
);
132 dir
.d_namlen
= (uint16_t)strlen(f
->name
);
134 dir
.d_type
= f
->dir
? DT_DIR
: DT_REG
;
135 DPRINTF(("readdir %s %d\n", dir
.d_name
, dir
.d_type
));
136 #if defined(__FreeBSD__) || defined(__APPLE__)
137 dir
.d_reclen
= (uint16_t)-1; /* Does not have _DIRENT_RECLEN */
139 dir
.d_reclen
= _DIRENT_RECLEN(&dir
, dir
.d_namlen
);
147 gl_stat(const char *name
, struct stat
*st
)
149 char buf
[MAXPATHLEN
];
150 trim(buf
, sizeof(buf
), name
);
151 memset(st
, 0, sizeof(*st
));
153 if (strcmp(buf
, "a") == 0 || strcmp(buf
, "a/b") == 0) {
154 st
->st_mode
|= S_IFDIR
;
158 if (buf
[0] == 'a' && buf
[1] == '/') {
162 if (buf
[2] == 'b' && buf
[3] == '/') {
164 count
= __arraycount(b
);
168 count
= __arraycount(a
);
172 for (size_t i
= 0; i
< count
; i
++)
173 if (strcmp(f
[i
].name
, buf
+ offs
) == 0)
176 DPRINTF(("stat %s %d\n", buf
, st
->st_mode
));
182 gl_lstat(const char *name
, struct stat
*st
)
184 return gl_stat(name
, st
);
190 struct gl_dir
*dd
= v
;
192 DPRINTF(("closedir %p\n", dd
));
196 run(const char *p
, int flags
, const char **res
, size_t len
)
201 memset(&gl
, 0, sizeof(gl
));
202 gl
.gl_opendir
= gl_opendir
;
203 gl
.gl_readdir
= gl_readdir
;
204 gl
.gl_closedir
= gl_closedir
;
205 gl
.gl_stat
= gl_stat
;
206 gl
.gl_lstat
= gl_lstat
;
208 T_ASSERT_POSIX_ZERO(glob(p
, GLOB_ALTDIRFUNC
| flags
, NULL
, &gl
), NULL
);
210 for (i
= 0; i
< gl
.gl_pathc
; i
++)
211 DPRINTF(("%s\n", gl
.gl_pathv
[i
]));
213 T_EXPECT_EQ(len
, gl
.gl_pathc
, NULL
);
214 for (i
= 0; i
< gl
.gl_pathc
; i
++)
215 T_EXPECT_EQ_STR(gl
.gl_pathv
[i
], res
[i
], NULL
);
222 T_DECL(glob_star
, "Test glob(3) ** with GLOB_STAR")
224 run("a/**", GLOB_STAR
, glob_star
, __arraycount(glob_star
));
228 T_DECL(glob_star_not
, "Test glob(3) ** without GLOB_STAR")
230 run("a/**", 0, glob_star_not
, __arraycount(glob_star_not
));
235 * Remove this test for now - the GLOB_NOCHECK return value has been
236 * re-defined to return a modified pattern in revision 1.33 of glob.c
238 * ATF_TP_ADD_TC(tp, glob_nocheck);
240 T_DECL(glob_nocheck
, "Test glob(3) pattern with backslash and GLOB_NOCHECK")
242 static const char pattern
[] = { 'f', 'o', 'o', '\\', ';', 'b', 'a',
244 static const char *glob_nocheck
[] = {
247 run(pattern
, GLOB_NOCHECK
, glob_nocheck
, __arraycount(glob_nocheck
));