diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | posix/fnmatch_loop.c | 15 | ||||
-rw-r--r-- | posix/tst-fnmatch.input | 23 |
3 files changed, 31 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog index c668caba4a..12839f993d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2000-10-21 Ulrich Drepper <drepper@redhat.com> + * posix/fnmatch_loop.c: Make FNM_LEADING_DIR behave as GNU tar + expects it. Patch by Colin Watson <riva.ucam.org>. + * posix/tst-fnmatch.input: Add test cases for FNM_LEADING_DIR. + * elf/dl-open.c (add_to_global): New function. Split out from dl_open_worker. (dl_open_worker): Call add_to_global not only for new objects, also for diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c index 6b20aa4304..4c619ed4bb 100644 --- a/posix/fnmatch_loop.c +++ b/posix/fnmatch_loop.c @@ -99,25 +99,18 @@ FCT (pattern, string, no_leading_period, flags) if (c == L('\0')) /* The wildcard(s) is/are the last element of the pattern. If the name is a file name and contains another slash - this does mean it cannot match. If the FNM_LEADING_DIR - flag is set and exactly one slash is following, we have - a match. */ + this means it cannot match, unless the FNM_LEADING_DIR + flag is set. */ { int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH; if (flags & FNM_FILE_NAME) { - const CHAR *slashp = STRCHR (n, L('/')); - if (flags & FNM_LEADING_DIR) - { - if (slashp != NULL - && STRCHR (slashp + 1, L('/')) == NULL) - result = 0; - } + result = 0; else { - if (slashp == NULL) + if (STRCHR (n, L('/')) == NULL) result = 0; } } diff --git a/posix/tst-fnmatch.input b/posix/tst-fnmatch.input index 7c79ddc3ab..3e0fb95ca2 100644 --- a/posix/tst-fnmatch.input +++ b/posix/tst-fnmatch.input @@ -459,3 +459,26 @@ de_DE.ISO-8859-1 "á" "[[=ä=]b]" 0 de_DE.ISO-8859-1 "ä" "[[=ä=]b]" 0 de_DE.ISO-8859-1 "b" "[[=ä=]b]" 0 de_DE.ISO-8859-1 "c" "[[=ä=]b]" NOMATCH + +# Test of GNU extensions. +C "x" "x" 0 PATHNAME|LEADING_DIR +C "x/y" "x" 0 PATHNAME|LEADING_DIR +C "x/y/z" "x" 0 PATHNAME|LEADING_DIR +C "x" "*" 0 PATHNAME|LEADING_DIR +C "x/y" "*" 0 PATHNAME|LEADING_DIR +C "x/y/z" "*" 0 PATHNAME|LEADING_DIR +C "x" "*x" 0 PATHNAME|LEADING_DIR +C "x/y" "*x" 0 PATHNAME|LEADING_DIR +C "x/y/z" "*x" 0 PATHNAME|LEADING_DIR +C "x" "x*" 0 PATHNAME|LEADING_DIR +C "x/y" "x*" 0 PATHNAME|LEADING_DIR +C "x/y/z" "x*" 0 PATHNAME|LEADING_DIR +C "x" "a" NOMATCH PATHNAME|LEADING_DIR +C "x/y" "a" NOMATCH PATHNAME|LEADING_DIR +C "x/y/z" "a" NOMATCH PATHNAME|LEADING_DIR +C "x" "x/y" NOMATCH PATHNAME|LEADING_DIR +C "x/y" "x/y" 0 PATHNAME|LEADING_DIR +C "x/y/z" "x/y" 0 PATHNAME|LEADING_DIR +C "x" "x?y" NOMATCH PATHNAME|LEADING_DIR +C "x/y" "x?y" NOMATCH PATHNAME|LEADING_DIR +C "x/y/z" "x?y" NOMATCH PATHNAME|LEADING_DIR |