Updated from libc
authorRoland McGrath <roland@redhat.com>
Thu, 27 Apr 1995 16:43:27 +0000 (16:43 +0000)
committerRoland McGrath <roland@redhat.com>
Thu, 27 Apr 1995 16:43:27 +0000 (16:43 +0000)
glob/ChangeLog
glob/glob.c

index a81698a8ec12b4abfa7eadf736a8458f55d674d5..6e535eef1a75407ecd7f2788a747db9207d9cc60 100644 (file)
@@ -1,3 +1,11 @@
+Tue Apr 25 17:17:19 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+
+       * posix/glob.c (glob): If GLOB_MARK set, stat names to find
+       directories and append slashes to them in final pass before
+       sorting.
+       (glob_in_dir): If GLOB_MARK set, just allocate the extra char for the
+       slash; never append it here.
+
 Wed Mar  8 13:38:13 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * posix/glob/configure.bat: Fixes from DJ.
index 243730d9aef46d8a6f4a1f751a7bb01ea365aa68..81f3049cb27119510ce6f64014968324b54076e6 100644 (file)
@@ -26,6 +26,7 @@ Cambridge, MA 02139, USA.  */
 
 #include <errno.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 
 
 /* Comment out all this code if we are using the GNU C Library, and are not
@@ -173,6 +174,17 @@ extern char *alloca ();
 
 #endif
 
+#ifndef __GNU_LIBRARY__
+#define __lstat lstat
+#ifndef HAVE_LSTAT
+#define lstat stat
+#endif
+#ifdef STAT_MACROS_BROKEN
+#undef S_ISDIR
+#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+#endif
+
 #ifndef        STDC_HEADERS
 #undef size_t
 #define        size_t  unsigned int
@@ -394,9 +406,21 @@ glob (pattern, flags, errfunc, pglob)
        }
     }
 
+  if (flags & GLOB_MARK)
+    {
+      /* Append slashes to directory names.  glob_in_dir has already
+        allocated the extra character for us.  */
+      int i;
+      struct stat st;
+      for (i = oldcount; i < pglob->gl_pathc; ++i)
+       if (__lstat (pglob->gl_pathv[i], &st) == 0 &&
+           S_ISDIR (st.st_mode))
+         strcat (pglob->gl_pathv[i], "/");
+    }
+
   if (!(flags & GLOB_NOSORT))
     /* Sort the vector.  */
-    qsort ((__ptr_t) & pglob->gl_pathv[oldcount],
+    qsort ((__ptr_t) &pglob->gl_pathv[oldcount],
           pglob->gl_pathc - oldcount,
           sizeof (char *), collated_compare);
 
@@ -595,8 +619,6 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
                if (new->name == NULL)
                  goto memory_error;
                memcpy ((__ptr_t) new->name, name, len);
-               if (flags & GLOB_MARK)
-                 new->name[len++] = '/';
                new->name[len] = '\0';
                new->next = names;
                names = new;
@@ -611,12 +633,10 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
       nfound = 1;
       names = (struct globlink *) __alloca (sizeof (struct globlink));
       names->next = NULL;
-      names->name = (char *) malloc (len + ((flags & GLOB_MARK) ? 1 : 0) + 1);
+      names->name = (char *) malloc (len + 1);
       if (names->name == NULL)
        goto memory_error;
       memcpy (names->name, pattern, len);
-      if (flags & GLOB_MARK)
-       names->name[len++] = '/';
       names->name[len] = '\0';
     }