summaryrefslogtreecommitdiff
path: root/libc/posix
diff options
context:
space:
mode:
Diffstat (limited to 'libc/posix')
-rw-r--r--libc/posix/glob.c5
-rw-r--r--libc/posix/tst-gnuglob.c10
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, "");