bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] fix wildcard when pattern has a trailing slash.


From: Dmitry Goncharov
Subject: [PATCH] fix wildcard when pattern has a trailing slash.
Date: Sat, 16 Dec 2017 23:57:58 -0500
User-agent: Mutt/1.5.21 (2010-09-15)

If patterns has a trailing slash then glob has to match directories only.

If the pattern is only 2 characters long (e.g. */) glob already matches
directories only. If the pattern is longer e.g. hello*/ then glob matches only
directories or files and directoires depending on type in readdir_result.

regards, Dmitry

diff --git a/glob/glob.c b/glob/glob.c
index f3911bc..6f8c8a4 100644
--- a/glob/glob.c
+++ b/glob/glob.c
@@ -370,6 +375,7 @@ glob (pattern, flags, errfunc, pglob)
   size_t dirlen;
   int status;
   int oldcount;
+  int retval = 0;
 
   if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
     {
@@ -1028,24 +1034,43 @@ glob (pattern, flags, errfunc, pglob)
   if (flags & GLOB_MARK)
     {
       /* Append slashes to directory names.  */
-      int i;
+      int i, e;
       struct stat st;
-      for (i = oldcount; i < pglob->gl_pathc; ++i)
-       if (((flags & GLOB_ALTDIRFUNC)
-            ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
-            : __stat (pglob->gl_pathv[i], &st)) == 0
-           && S_ISDIR (st.st_mode))
-         {
-           size_t len = strlen (pglob->gl_pathv[i]) + 2;
-           char *new = realloc (pglob->gl_pathv[i], len);
-           if (new == NULL)
-             {
-               globfree (pglob);
-               return GLOB_NOSPACE;
-             }
-           strcpy (&new[len - 2], "/");
-           pglob->gl_pathv[i] = new;
-         }
+      for (i = e = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
+        {
+         if (((flags & GLOB_ALTDIRFUNC)
+              ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
+              : __stat (pglob->gl_pathv[i], &st)) == 0
+             && S_ISDIR (st.st_mode))
+           {
+             size_t len = strlen (pglob->gl_pathv[i]) + 2;
+             char *new = realloc (pglob->gl_pathv[i], len);
+             if (new == NULL)
+               {
+                 globfree (pglob);
+                 return GLOB_NOSPACE;
+               }
+             strcpy (&new[len - 2], "/");
+             if (pglob->gl_pathv[e] == NULL)
+               {
+                 pglob->gl_pathv[e++] = new;
+                 pglob->gl_pathv[i] = NULL;
+               }
+             else
+               pglob->gl_pathv[i] = new;
+           }
+         else if (flags & GLOB_ONLYDIR)
+           {
+             free (pglob->gl_pathv[i]);
+             pglob->gl_pathv[i] = NULL;
+             if (pglob->gl_pathv[e] != NULL)
+               e = i;
+           }
+       }
+       if (pglob->gl_pathv[e] == NULL)
+         pglob->gl_pathc = e - pglob->gl_offs;
+       if (pglob->gl_pathc == 0)
+         retval = GLOB_NOMATCH;
     }
 
   if (!(flags & GLOB_NOSORT))
@@ -1061,7 +1086,7 @@ glob (pattern, flags, errfunc, pglob)
             sizeof (char *), collated_compare);
     }
 
-  return 0;
+  return retval;
 }
 
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]