]>
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
));