diff options
Diffstat (limited to 'libc/posix')
-rw-r--r-- | libc/posix/glob.c | 5 | ||||
-rw-r--r-- | libc/posix/tst-gnuglob.c | 10 |
2 files changed, 13 insertions, 2 deletions
diff --git a/libc/posix/glob.c b/libc/posix/glob.c index 02c8477c6..211c5b980 100644 --- a/libc/posix/glob.c +++ b/libc/posix/glob.c @@ -279,6 +279,11 @@ glob (pattern, flags, errfunc, pglob) return -1; } + /* POSIX requires all slashes to be matched. This means that with + a trailing slash we must match only directories. */ + if (pattern[0] && pattern[strlen (pattern) - 1] == '/') + flags |= GLOB_ONLYDIR; + if (!(flags & GLOB_DOOFFS)) /* Have to do this so `globfree' knows where to start freeing. It also makes all the code that uses gl_offs simpler. */ diff --git a/libc/posix/tst-gnuglob.c b/libc/posix/tst-gnuglob.c index 0c967d0a7..6e42724d0 100644 --- a/libc/posix/tst-gnuglob.c +++ b/libc/posix/tst-gnuglob.c @@ -168,7 +168,7 @@ my_opendir (const char *s) my_DIR *dir; - if (idx == -1) + if (idx == -1 || filesystem[idx].type != DT_DIR) { PRINTF ("my_opendir(\"%s\") == NULL\n", s); return NULL; @@ -358,7 +358,7 @@ test_result (const char *fmt, int flags, glob_t *gl, const char *str[]) break; if (str[inner] == NULL) - errstr = ok ? "" : " *** WRONG"; + errstr = ok ? "" : " *** WRONG"; else errstr = ok ? "" : " * wrong position"; @@ -483,6 +483,12 @@ main (void) "/file1lev1", "/file2lev1"); + test ("*/*/", 0 , 0, + "dir1lev1/dir1lev2/", + "dir1lev1/dir2lev2/", + "dir1lev1/dir3lev2/", + "dir2lev1/dir1lev2/"); + test ("", 0, GLOB_NOMATCH, NULL); test ("", GLOB_NOCHECK, 0, ""); |