1 /* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011
2 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 #include <sys/types.h>
31 /* Outcomment the following line for production quality code. */
32 /* #define NDEBUG 1 */
35 #include <stdio.h> /* Needed on stupid SunOS for assert. */
37 #if !defined _LIBC || !defined GLOB_ONLY_P
38 #if defined HAVE_UNISTD_H || defined _LIBC
41 # ifdef _POSIX_VERSION
51 # define __set_errno(val) errno = (val)
54 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
56 # define NAMLEN(dirent) strlen((dirent)->d_name)
58 # define dirent direct
59 # define NAMLEN(dirent) (dirent)->d_namlen
60 # ifdef HAVE_SYS_NDIR_H
61 # include <sys/ndir.h>
63 # ifdef HAVE_SYS_DIR_H
71 # endif /* HAVE_VMSDIR_H */
75 /* In GNU systems, <dirent.h> defines this macro for us. */
78 # define NAMLEN(d) _D_NAMLEN(d)
81 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
82 if the `d_type' member for `struct dirent' is available.
83 HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
84 #if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
85 /* True if the directory entry D must be of type T. */
86 # define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
88 /* True if the directory entry D might be a symbolic link. */
89 # define DIRENT_MIGHT_BE_SYMLINK(d) \
90 ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
92 /* True if the directory entry D might be a directory. */
93 # define DIRENT_MIGHT_BE_DIR(d) \
94 ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
96 #else /* !HAVE_D_TYPE */
97 # define DIRENT_MUST_BE(d, t) false
98 # define DIRENT_MIGHT_BE_SYMLINK(d) true
99 # define DIRENT_MIGHT_BE_DIR(d) true
100 #endif /* HAVE_D_TYPE */
102 /* If the system has the `struct dirent64' type we use it internally. */
103 #if defined _LIBC && !defined COMPILE_GLOB64
104 # if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
105 # define CONVERT_D_NAMLEN(d64, d32)
107 # define CONVERT_D_NAMLEN(d64, d32) \
108 (d64)->d_namlen = (d32)->d_namlen;
111 # if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
112 # define CONVERT_D_INO(d64, d32)
114 # define CONVERT_D_INO(d64, d32) \
115 (d64)->d_ino = (d32)->d_ino;
118 # ifdef _DIRENT_HAVE_D_TYPE
119 # define CONVERT_D_TYPE(d64, d32) \
120 (d64)->d_type = (d32)->d_type;
122 # define CONVERT_D_TYPE(d64, d32)
125 # define CONVERT_DIRENT_DIRENT64(d64, d32) \
126 memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1); \
127 CONVERT_D_NAMLEN (d64, d32) \
128 CONVERT_D_INO (d64, d32) \
129 CONVERT_D_TYPE (d64, d32)
133 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
134 /* Posix does not require that the d_ino field be present, and some
135 systems do not provide it. */
136 # define REAL_DIR_ENTRY(dp) 1
138 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
144 /* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
147 # define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
154 # define strdup(str) __strdup (str)
155 # define sysconf(id) __sysconf (id)
156 # define closedir(dir) __closedir (dir)
157 # define opendir(name) __opendir (name)
158 # define readdir(str) __readdir64 (str)
159 # define getpwnam_r(name, bufp, buf, len, res) \
160 __getpwnam_r (name, bufp, buf, len, res)
162 # define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
164 # define struct_stat64 struct stat64
166 # include "getlogin_r.h"
167 # include "mempcpy.h"
168 # include "stat-macros.h"
170 # define __stat64(fname, buf) stat (fname, buf)
171 # define struct_stat64 struct stat
172 # define __stat(fname, buf) stat (fname, buf)
173 # define __alloca alloca
174 # define __readdir readdir
175 # define __readdir64 readdir64
176 # define __glob_pattern_p glob_pattern_p
181 #ifdef _SC_GETPW_R_SIZE_MAX
182 # define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
184 # define GETPW_R_SIZE_MAX() (-1)
186 #ifdef _SC_LOGIN_NAME_MAX
187 # define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
189 # define GET_LOGIN_NAME_MAX() (-1)
192 static const char *next_brace_sub (const char *begin, int flags) __THROW;
194 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
196 #ifndef attribute_hidden
197 # define attribute_hidden
200 static int glob_in_dir (const char *pattern, const char *directory,
201 int flags, int (*errfunc) (const char *, int),
202 glob_t *pglob, size_t alloca_used);
203 extern int __glob_pattern_type (const char *pattern, int quote)
206 #if !defined _LIBC || !defined GLOB_ONLY_P
207 static int prefix_array (const char *prefix, char **array, size_t n) __THROW;
208 static int collated_compare (const void *, const void *) __THROW;
211 /* Find the end of the sub-pattern in a brace expression. */
213 next_brace_sub (const char *cp, int flags)
215 unsigned int depth = 0;
217 if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\')
225 if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
232 return *cp != '\0' ? cp : NULL;
235 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
237 /* Do glob searching for PATTERN, placing results in PGLOB.
238 The bits defined above may be set in FLAGS.
239 If a directory cannot be opened or read and ERRFUNC is not nil,
240 it is called with the pathname that caused the error, and the
241 `errno' value from the failing call; if it returns non-zero
242 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
243 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
244 Otherwise, `glob' returns zero. */
246 #ifdef GLOB_ATTRIBUTE
249 glob (pattern, flags, errfunc, pglob)
252 int (*errfunc) (const char *, int);
255 const char *filename;
256 char *dirname = NULL;
261 int dirname_modified;
262 int malloc_dirname = 0;
266 size_t alloca_used = 0;
269 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
271 __set_errno (EINVAL);
275 if (!(flags & GLOB_DOOFFS))
276 /* Have to do this so `globfree' knows where to start freeing. It
277 also makes all the code that uses gl_offs simpler. */
280 if (flags & GLOB_BRACE)
284 if (flags & GLOB_NOESCAPE)
285 begin = strchr (pattern, '{');
297 if (*begin == '\\' && begin[1] != '\0')
299 else if (*begin == '{')
308 /* Allocate working buffer large enough for our work. Note that
309 we have at least an opening and closing brace. */
317 size_t pattern_len = strlen (pattern) - 1;
319 int alloca_onealt = __libc_use_alloca (alloca_used + pattern_len);
321 onealt = alloca_account (pattern_len, alloca_used);
325 onealt = (char *) malloc (pattern_len);
328 if (!(flags & GLOB_APPEND))
331 pglob->gl_pathv = NULL;
337 /* We know the prefix for all sub-patterns. */
338 alt_start = mempcpy (onealt, pattern, begin - pattern);
340 /* Find the first sub-pattern and at the same time find the
341 rest after the closing brace. */
342 next = next_brace_sub (begin + 1, flags);
345 /* It is an illegal expression. */
348 if (__builtin_expect (!alloca_onealt, 0))
351 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
354 /* Now find the end of the whole brace expression. */
358 rest = next_brace_sub (rest + 1, flags);
360 /* It is an illegal expression. */
363 /* Please note that we now can be sure the brace expression
365 rest_len = strlen (++rest) + 1;
367 /* We have a brace expression. BEGIN points to the opening {,
368 NEXT points past the terminator of the first element, and END
369 points past the final }. We will accumulate result names from
370 recursive runs for each brace alternative in the buffer using
373 if (!(flags & GLOB_APPEND))
375 /* This call is to set a new vector, so clear out the
376 vector so we can append to it. */
378 pglob->gl_pathv = NULL;
380 firstc = pglob->gl_pathc;
387 /* Construct the new glob expression. */
388 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
390 result = glob (onealt,
391 ((flags & ~(GLOB_NOCHECK | GLOB_NOMAGIC))
392 | GLOB_APPEND), errfunc, pglob);
394 /* If we got an error, return it. */
395 if (result && result != GLOB_NOMATCH)
398 if (__builtin_expect (!alloca_onealt, 0))
401 if (!(flags & GLOB_APPEND))
410 /* We saw the last entry. */
414 next = next_brace_sub (p, flags);
415 assert (next != NULL);
419 if (__builtin_expect (!alloca_onealt, 0))
423 if (pglob->gl_pathc != firstc)
424 /* We found some entries. */
426 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
431 if (!(flags & GLOB_APPEND))
434 if (!(flags & GLOB_DOOFFS))
435 pglob->gl_pathv = NULL;
439 pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1)
441 if (pglob->gl_pathv == NULL)
444 for (i = 0; i <= pglob->gl_offs; ++i)
445 pglob->gl_pathv[i] = NULL;
449 oldcount = pglob->gl_pathc + pglob->gl_offs;
451 /* Find the filename. */
452 filename = strrchr (pattern, '/');
453 #if defined __MSDOS__ || defined WINDOWS32
454 /* The case of "d:pattern". Since `:' is not allowed in
455 file names, we can safely assume that wherever it
456 happens in pattern, it signals the filename part. This
457 is so we could some day support patterns like "[a-z]:foo". */
458 if (filename == NULL)
459 filename = strchr (pattern, ':');
460 #endif /* __MSDOS__ || WINDOWS32 */
461 dirname_modified = 0;
462 if (filename == NULL)
464 /* This can mean two things: a simple name or "~name". The latter
465 case is nothing but a notation for a directory. */
466 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
468 dirname = (char *) pattern;
469 dirlen = strlen (pattern);
471 /* Set FILENAME to NULL as a special flag. This is ugly but
472 other solutions would require much more code. We test for
473 this special case below. */
478 if (__builtin_expect (pattern[0] == '\0', 0))
480 dirs.gl_pathv = NULL;
486 dirname = (char *) "";
488 dirname = (char *) ".";
493 else if (filename == pattern
494 || (filename == pattern + 1 && pattern[0] == '\\'
495 && (flags & GLOB_NOESCAPE) == 0))
497 /* "/pattern" or "\\/pattern". */
498 dirname = (char *) "/";
505 dirlen = filename - pattern;
506 #if defined __MSDOS__ || defined WINDOWS32
508 || (filename > pattern + 1 && filename[-1] == ':'))
513 drive_spec = (char *) __alloca (dirlen + 1);
514 *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
515 /* For now, disallow wildcards in the drive spec, to
516 prevent infinite recursion in glob. */
517 if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
519 /* If this is "d:pattern", we need to copy `:' to DIRNAME
520 as well. If it's "d:/pattern", don't remove the slash
521 from "d:/", since "d:" and "d:/" are not the same.*/
525 if (__libc_use_alloca (alloca_used + dirlen + 1))
526 newp = alloca_account (dirlen + 1, alloca_used);
530 newp = malloc (dirlen + 1);
535 *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
539 if (filename[0] == '\0'
540 #if defined __MSDOS__ || defined WINDOWS32
541 && dirname[dirlen - 1] != ':'
542 && (dirlen < 3 || dirname[dirlen - 2] != ':'
543 || dirname[dirlen - 1] != '/')
546 /* "pattern/". Expand "pattern", appending slashes. */
548 int orig_flags = flags;
549 if (!(flags & GLOB_NOESCAPE) && dirname[dirlen - 1] == '\\')
551 /* "pattern\\/". Remove the final backslash if it hasn't
553 char *p = (char *) &dirname[dirlen - 1];
555 while (p > dirname && p[-1] == '\\') --p;
556 if ((&dirname[dirlen] - p) & 1)
558 *(char *) &dirname[--dirlen] = '\0';
559 flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
562 int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
564 pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
565 | (flags & GLOB_MARK));
566 else if (val == GLOB_NOMATCH && flags != orig_flags)
568 /* Make sure globfree (&dirs); is a nop. */
569 dirs.gl_pathv = NULL;
571 oldcount = pglob->gl_pathc + pglob->gl_offs;
580 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
582 if (dirname[1] == '\0' || dirname[1] == '/'
583 || (!(flags & GLOB_NOESCAPE) && dirname[1] == '\\'
584 && (dirname[2] == '\0' || dirname[2] == '/')))
586 /* Look up home directory. */
587 char *home_dir = getenv ("HOME");
588 int malloc_home_dir = 0;
590 if (home_dir == NULL || home_dir[0] == '\0')
594 if (home_dir == NULL || home_dir[0] == '\0')
595 home_dir = "c:/users/default"; /* poor default */
597 if (home_dir == NULL || home_dir[0] == '\0')
601 size_t buflen = GET_LOGIN_NAME_MAX () + 1;
604 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
607 name = alloca_account (buflen, alloca_used);
609 success = getlogin_r (name, buflen) == 0;
613 # if defined HAVE_GETPWNAM_R || defined _LIBC
614 long int pwbuflen = GETPW_R_SIZE_MAX ();
617 int malloc_pwtmpbuf = 0;
622 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
623 Try a moderate value. */
626 if (__libc_use_alloca (alloca_used + pwbuflen))
627 pwtmpbuf = alloca_account (pwbuflen, alloca_used);
630 pwtmpbuf = malloc (pwbuflen);
631 if (pwtmpbuf == NULL)
633 retval = GLOB_NOSPACE;
639 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
649 && __libc_use_alloca (alloca_used
651 pwtmpbuf = extend_alloca_account (pwtmpbuf, pwbuflen,
656 char *newp = realloc (malloc_pwtmpbuf
661 if (__builtin_expect (malloc_pwtmpbuf, 0))
663 retval = GLOB_NOSPACE;
667 pwbuflen = 2 * pwbuflen;
677 if (!malloc_pwtmpbuf)
678 home_dir = p->pw_dir;
681 size_t home_dir_len = strlen (p->pw_dir) + 1;
682 if (__libc_use_alloca (alloca_used + home_dir_len))
683 home_dir = alloca_account (home_dir_len,
687 home_dir = malloc (home_dir_len);
688 if (home_dir == NULL)
691 retval = GLOB_NOSPACE;
696 memcpy (home_dir, p->pw_dir, home_dir_len);
703 if (home_dir == NULL || home_dir[0] == '\0')
705 if (flags & GLOB_TILDE_CHECK)
707 if (__builtin_expect (malloc_home_dir, 0))
709 retval = GLOB_NOMATCH;
713 home_dir = (char *) "~"; /* No luck. */
715 # endif /* WINDOWS32 */
717 /* Now construct the full directory. */
718 if (dirname[1] == '\0')
720 if (__builtin_expect (malloc_dirname, 0))
724 dirlen = strlen (dirname);
725 malloc_dirname = malloc_home_dir;
730 size_t home_len = strlen (home_dir);
731 int use_alloca = __libc_use_alloca (alloca_used
732 + home_len + dirlen);
734 newp = alloca_account (home_len + dirlen, alloca_used);
737 newp = malloc (home_len + dirlen);
740 if (__builtin_expect (malloc_home_dir, 0))
742 retval = GLOB_NOSPACE;
747 mempcpy (mempcpy (newp, home_dir, home_len),
748 &dirname[1], dirlen);
750 if (__builtin_expect (malloc_dirname, 0))
754 dirlen += home_len - 1;
755 malloc_dirname = !use_alloca;
757 dirname_modified = 1;
759 # if !defined _AMIGA && !defined WINDOWS32
762 char *end_name = strchr (dirname, '/');
764 int malloc_user_name = 0;
765 const char *home_dir;
766 char *unescape = NULL;
768 if (!(flags & GLOB_NOESCAPE))
770 if (end_name == NULL)
772 unescape = strchr (dirname, '\\');
774 end_name = strchr (unescape, '\0');
777 unescape = memchr (dirname, '\\', end_name - dirname);
779 if (end_name == NULL)
780 user_name = dirname + 1;
784 if (__libc_use_alloca (alloca_used + (end_name - dirname)))
785 newp = alloca_account (end_name - dirname, alloca_used);
788 newp = malloc (end_name - dirname);
791 retval = GLOB_NOSPACE;
794 malloc_user_name = 1;
796 if (unescape != NULL)
798 char *p = mempcpy (newp, dirname + 1,
799 unescape - dirname - 1);
807 /* "~fo\\o\\" unescape to user_name "foo\\",
808 but "~fo\\o\\/" unescape to user_name
810 if (filename == NULL)
821 *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
826 /* Look up specific user's home directory. */
829 # if defined HAVE_GETPWNAM_R || defined _LIBC
830 long int buflen = GETPW_R_SIZE_MAX ();
832 int malloc_pwtmpbuf = 0;
838 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
842 if (__libc_use_alloca (alloca_used + buflen))
843 pwtmpbuf = alloca_account (buflen, alloca_used);
846 pwtmpbuf = malloc (buflen);
847 if (pwtmpbuf == NULL)
850 if (__builtin_expect (malloc_user_name, 0))
852 retval = GLOB_NOSPACE;
858 while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
866 && __libc_use_alloca (alloca_used + 2 * buflen))
867 pwtmpbuf = extend_alloca_account (pwtmpbuf, buflen,
868 2 * buflen, alloca_used);
871 char *newp = realloc (malloc_pwtmpbuf ? pwtmpbuf : NULL,
875 if (__builtin_expect (malloc_pwtmpbuf, 0))
885 p = getpwnam (user_name);
888 if (__builtin_expect (malloc_user_name, 0))
891 /* If we found a home directory use this. */
894 size_t home_len = strlen (p->pw_dir);
895 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
897 if (__builtin_expect (malloc_dirname, 0))
901 if (__libc_use_alloca (alloca_used + home_len + rest_len + 1))
902 dirname = alloca_account (home_len + rest_len + 1,
906 dirname = malloc (home_len + rest_len + 1);
909 if (__builtin_expect (malloc_pwtmpbuf, 0))
911 retval = GLOB_NOSPACE;
916 *((char *) mempcpy (mempcpy (dirname, p->pw_dir, home_len),
917 end_name, rest_len)) = '\0';
919 dirlen = home_len + rest_len;
920 dirname_modified = 1;
922 if (__builtin_expect (malloc_pwtmpbuf, 0))
927 if (__builtin_expect (malloc_pwtmpbuf, 0))
930 if (flags & GLOB_TILDE_CHECK)
931 /* We have to regard it as an error if we cannot find the
937 # endif /* Not Amiga && not WINDOWS32. */
939 #endif /* Not VMS. */
941 /* Now test whether we looked for "~" or "~NAME". In this case we
942 can give the answer now. */
943 if (filename == NULL)
948 /* Return the directory if we don't check for error or if it exists. */
949 if ((flags & GLOB_NOCHECK)
950 || (((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
951 ? ((*pglob->gl_stat) (dirname, &st) == 0
952 && S_ISDIR (st.st_mode))
953 : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
955 int newcount = pglob->gl_pathc + pglob->gl_offs;
959 = (char **) realloc (pglob->gl_pathv,
960 (newcount + 1 + 1) * sizeof (char *));
961 if (new_gl_pathv == NULL)
964 free (pglob->gl_pathv);
965 pglob->gl_pathv = NULL;
969 pglob->gl_pathv = new_gl_pathv;
971 if (flags & GLOB_MARK)
974 pglob->gl_pathv[newcount] = malloc (dirlen + 2);
975 if (pglob->gl_pathv[newcount] == NULL)
977 p = mempcpy (pglob->gl_pathv[newcount], dirname, dirlen);
983 pglob->gl_pathv[newcount] = strdup (dirname);
984 if (pglob->gl_pathv[newcount] == NULL)
987 pglob->gl_pathv[++newcount] = NULL;
989 pglob->gl_flags = flags;
998 meta = __glob_pattern_type (dirname, !(flags & GLOB_NOESCAPE));
999 /* meta is 1 if correct glob pattern containing metacharacters.
1000 If meta has bit (1 << 2) set, it means there was an unterminated
1001 [ which we handle the same, using fnmatch. Broken unterminated
1002 pattern bracket expressions ought to be rare enough that it is
1003 not worth special casing them, fnmatch will do the right thing. */
1006 /* The directory name contains metacharacters, so we
1007 have to glob for the directory, and then glob for
1008 the pattern in each directory found. */
1011 if (!(flags & GLOB_NOESCAPE) && dirlen > 0 && dirname[dirlen - 1] == '\\')
1013 /* "foo\\/bar". Remove the final backslash from dirname
1014 if it has not been quoted. */
1015 char *p = (char *) &dirname[dirlen - 1];
1017 while (p > dirname && p[-1] == '\\') --p;
1018 if ((&dirname[dirlen] - p) & 1)
1019 *(char *) &dirname[--dirlen] = '\0';
1022 if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) != 0, 0))
1024 /* Use the alternative access functions also in the recursive
1026 dirs.gl_opendir = pglob->gl_opendir;
1027 dirs.gl_readdir = pglob->gl_readdir;
1028 dirs.gl_closedir = pglob->gl_closedir;
1029 dirs.gl_stat = pglob->gl_stat;
1030 dirs.gl_lstat = pglob->gl_lstat;
1033 status = glob (dirname,
1034 ((flags & (GLOB_ERR | GLOB_NOESCAPE
1036 | GLOB_NOSORT | GLOB_ONLYDIR),
1040 if ((flags & GLOB_NOCHECK) == 0 || status != GLOB_NOMATCH)
1045 /* We have successfully globbed the preceding directory name.
1046 For each name we found, call glob_in_dir on it and FILENAME,
1047 appending the results to PGLOB. */
1048 for (i = 0; i < dirs.gl_pathc; ++i)
1054 /* Make globbing interruptible in the bash shell. */
1055 extern int interrupt_state;
1057 if (interrupt_state)
1060 return GLOB_ABORTED;
1065 old_pathc = pglob->gl_pathc;
1066 status = glob_in_dir (filename, dirs.gl_pathv[i],
1067 ((flags | GLOB_APPEND)
1068 & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
1069 errfunc, pglob, alloca_used);
1070 if (status == GLOB_NOMATCH)
1071 /* No matches in this directory. Try the next. */
1078 pglob->gl_pathc = 0;
1082 /* Stick the directory on the front of each name. */
1083 if (prefix_array (dirs.gl_pathv[i],
1084 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
1085 pglob->gl_pathc - old_pathc))
1089 pglob->gl_pathc = 0;
1090 return GLOB_NOSPACE;
1094 flags |= GLOB_MAGCHAR;
1096 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
1097 But if we have not found any matching entry and the GLOB_NOCHECK
1098 flag was set we must return the input pattern itself. */
1099 if (pglob->gl_pathc + pglob->gl_offs == oldcount)
1103 if (flags & GLOB_NOCHECK)
1105 int newcount = pglob->gl_pathc + pglob->gl_offs;
1106 char **new_gl_pathv;
1108 new_gl_pathv = (char **) realloc (pglob->gl_pathv,
1111 if (new_gl_pathv == NULL)
1114 return GLOB_NOSPACE;
1116 pglob->gl_pathv = new_gl_pathv;
1118 pglob->gl_pathv[newcount] = __strdup (pattern);
1119 if (pglob->gl_pathv[newcount] == NULL)
1123 pglob->gl_pathc = 0;
1124 return GLOB_NOSPACE;
1130 pglob->gl_pathv[newcount] = NULL;
1131 pglob->gl_flags = flags;
1136 return GLOB_NOMATCH;
1144 int old_pathc = pglob->gl_pathc;
1145 int orig_flags = flags;
1149 char *p = strchr (dirname, '\\'), *q;
1150 /* We need to unescape the dirname string. It is certainly
1151 allocated by alloca, as otherwise filename would be NULL
1152 or dirname wouldn't contain backslashes. */
1165 while (*p++ != '\0');
1166 dirname_modified = 1;
1168 if (dirname_modified)
1169 flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
1170 status = glob_in_dir (filename, dirname, flags, errfunc, pglob,
1174 if (status == GLOB_NOMATCH && flags != orig_flags
1175 && pglob->gl_pathc + pglob->gl_offs == oldcount)
1177 /* Make sure globfree (&dirs); is a nop. */
1178 dirs.gl_pathv = NULL;
1187 /* Stick the directory on the front of each name. */
1188 if (prefix_array (dirname,
1189 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
1190 pglob->gl_pathc - old_pathc))
1193 pglob->gl_pathc = 0;
1194 return GLOB_NOSPACE;
1199 if (flags & GLOB_MARK)
1201 /* Append slashes to directory names. */
1206 for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
1207 if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1208 ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
1209 && S_ISDIR (st.st_mode))
1210 : (__stat64 (pglob->gl_pathv[i], &st64) == 0
1211 && S_ISDIR (st64.st_mode))))
1213 size_t len = strlen (pglob->gl_pathv[i]) + 2;
1214 char *new = realloc (pglob->gl_pathv[i], len);
1218 pglob->gl_pathc = 0;
1219 return GLOB_NOSPACE;
1221 strcpy (&new[len - 2], "/");
1222 pglob->gl_pathv[i] = new;
1226 if (!(flags & GLOB_NOSORT))
1228 /* Sort the vector. */
1229 qsort (&pglob->gl_pathv[oldcount],
1230 pglob->gl_pathc + pglob->gl_offs - oldcount,
1231 sizeof (char *), collated_compare);
1235 if (__builtin_expect (malloc_dirname, 0))
1240 #if defined _LIBC && !defined glob
1241 libc_hidden_def (glob)
1245 #if !defined _LIBC || !defined GLOB_ONLY_P
1247 /* Free storage allocated in PGLOB by a previous `glob' call. */
1250 register glob_t *pglob;
1252 if (pglob->gl_pathv != NULL)
1255 for (i = 0; i < pglob->gl_pathc; ++i)
1256 free (pglob->gl_pathv[pglob->gl_offs + i]);
1257 free (pglob->gl_pathv);
1258 pglob->gl_pathv = NULL;
1261 #if defined _LIBC && !defined globfree
1262 libc_hidden_def (globfree)
1266 /* Do a collated comparison of A and B. */
1268 collated_compare (const void *a, const void *b)
1270 const char *const s1 = *(const char *const * const) a;
1271 const char *const s2 = *(const char *const * const) b;
1279 return strcoll (s1, s2);
1283 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1284 elements in place. Return nonzero if out of memory, zero if successful.
1285 A slash is inserted between DIRNAME and each elt of ARRAY,
1286 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1288 prefix_array (const char *dirname, char **array, size_t n)
1291 size_t dirlen = strlen (dirname);
1292 #if defined __MSDOS__ || defined WINDOWS32
1294 # define DIRSEP_CHAR sep_char
1296 # define DIRSEP_CHAR '/'
1299 if (dirlen == 1 && dirname[0] == '/')
1300 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1301 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1303 #if defined __MSDOS__ || defined WINDOWS32
1304 else if (dirlen > 1)
1306 if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
1307 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1309 else if (dirname[dirlen - 1] == ':')
1311 /* DIRNAME is "d:". Use `:' instead of `/'. */
1318 for (i = 0; i < n; ++i)
1320 size_t eltlen = strlen (array[i]) + 1;
1321 char *new = (char *) malloc (dirlen + 1 + eltlen);
1330 char *endp = mempcpy (new, dirname, dirlen);
1331 *endp++ = DIRSEP_CHAR;
1332 mempcpy (endp, array[i], eltlen);
1342 /* We must not compile this function twice. */
1343 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1345 __glob_pattern_type (pattern, quote)
1346 const char *pattern;
1349 register const char *p;
1352 for (p = pattern; *p != '\0'; ++p)
1381 /* Return nonzero if PATTERN contains any metacharacters.
1382 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1384 __glob_pattern_p (pattern, quote)
1385 const char *pattern;
1388 return __glob_pattern_type (pattern, quote) == 1;
1391 weak_alias (__glob_pattern_p, glob_pattern_p)
1395 #endif /* !GLOB_ONLY_P */
1398 /* We put this in a separate function mainly to allow the memory
1399 allocated with alloca to be recycled. */
1400 #if !defined _LIBC || !defined GLOB_ONLY_P
1402 __attribute_noinline__
1403 link_exists2_p (const char *dir, size_t dirlen, const char *fname,
1410 size_t fnamelen = strlen (fname);
1411 char *fullname = (char *) __alloca (dirlen + 1 + fnamelen + 1);
1417 mempcpy (mempcpy (mempcpy (fullname, dir, dirlen), "/", 1),
1418 fname, fnamelen + 1);
1421 return (*pglob->gl_stat) (fullname, &st) == 0;
1423 return ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1424 ? (*pglob->gl_stat) (fullname, &st)
1425 : __stat64 (fullname, &st64)) == 0);
1429 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1430 (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) \
1431 ? link_exists2_p (dirname, dirnamelen, fname, pglob) \
1432 : ({ struct stat64 st64; \
1433 __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0; }))
1435 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1436 link_exists2_p (dirname, dirnamelen, fname, pglob, flags)
1441 /* Like `glob', but PATTERN is a final pathname component,
1442 and matches are searched for in DIRECTORY.
1443 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1444 The GLOB_APPEND flag is assumed to be set (always appends). */
1446 glob_in_dir (const char *pattern, const char *directory, int flags,
1447 int (*errfunc) (const char *, int),
1448 glob_t *pglob, size_t alloca_used)
1450 size_t dirlen = strlen (directory);
1451 void *stream = NULL;
1454 struct globnames *next;
1458 #define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
1459 struct globnames init_names;
1460 struct globnames *names = &init_names;
1461 struct globnames *names_alloca = &init_names;
1467 alloca_used += sizeof (init_names);
1469 init_names.next = NULL;
1470 init_names.count = INITIAL_COUNT;
1472 meta = __glob_pattern_type (pattern, !(flags & GLOB_NOESCAPE));
1473 if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
1475 /* We need not do any tests. The PATTERN contains no meta
1476 characters and we must not return an error therefore the
1477 result will always contain exactly one name. */
1478 flags |= GLOB_NOCHECK;
1482 /* Since we use the normal file functions we can also use stat()
1483 to verify the file is there. */
1489 size_t patlen = strlen (pattern);
1490 int alloca_fullname = __libc_use_alloca (alloca_used
1491 + dirlen + 1 + patlen + 1);
1493 if (alloca_fullname)
1494 fullname = alloca_account (dirlen + 1 + patlen + 1, alloca_used);
1497 fullname = malloc (dirlen + 1 + patlen + 1);
1498 if (fullname == NULL)
1499 return GLOB_NOSPACE;
1502 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
1504 pattern, patlen + 1);
1505 if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1506 ? (*pglob->gl_stat) (fullname, &ust.st)
1507 : __stat64 (fullname, &ust.st64)) == 0)
1508 /* We found this file to be existing. Now tell the rest
1509 of the function to copy this name into the result. */
1510 flags |= GLOB_NOCHECK;
1512 if (__builtin_expect (!alloca_fullname, 0))
1517 stream = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1518 ? (*pglob->gl_opendir) (directory)
1519 : opendir (directory));
1522 if (errno != ENOTDIR
1523 && ((errfunc != NULL && (*errfunc) (directory, errno))
1524 || (flags & GLOB_ERR)))
1525 return GLOB_ABORTED;
1530 int dfd = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1531 ? -1 : dirfd ((DIR *) stream));
1533 int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
1534 | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
1535 #if defined _AMIGA || defined VMS
1539 flags |= GLOB_MAGCHAR;
1545 #if defined _LIBC && !defined COMPILE_GLOB64
1549 struct dirent64 d64;
1550 char room [offsetof (struct dirent64, d_name[0])
1555 if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
1557 struct dirent *d32 = (*pglob->gl_readdir) (stream);
1560 CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
1567 d = __readdir64 (stream);
1569 struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1570 ? ((struct dirent *)
1571 (*pglob->gl_readdir) (stream))
1572 : __readdir (stream));
1576 if (! REAL_DIR_ENTRY (d))
1579 /* If we shall match only directories use the information
1580 provided by the dirent call if possible. */
1581 if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d))
1586 if (fnmatch (pattern, name, fnm_flags) == 0)
1588 /* If the file we found is a symlink we have to
1589 make sure the target file exists. */
1590 if (!DIRENT_MIGHT_BE_SYMLINK (d)
1591 || link_exists_p (dfd, directory, dirlen, name, pglob,
1594 if (cur == names->count)
1596 struct globnames *newnames;
1597 size_t count = names->count * 2;
1598 size_t size = (sizeof (struct globnames)
1599 + ((count - INITIAL_COUNT)
1600 * sizeof (char *)));
1601 if (__libc_use_alloca (alloca_used + size))
1602 newnames = names_alloca
1603 = alloca_account (size, alloca_used);
1604 else if ((newnames = malloc (size))
1607 newnames->count = count;
1608 newnames->next = names;
1613 names->name[cur] = (char *) malloc (len + 1);
1614 if (names->name[cur] == NULL)
1616 *((char *) mempcpy (names->name[cur++], name, len))
1625 if (nfound == 0 && (flags & GLOB_NOCHECK))
1627 size_t len = strlen (pattern);
1629 names->name[cur] = (char *) malloc (len + 1);
1630 if (names->name[cur] == NULL)
1632 *((char *) mempcpy (names->name[cur++], pattern, len)) = '\0';
1635 int result = GLOB_NOMATCH;
1640 char **new_gl_pathv;
1642 = (char **) realloc (pglob->gl_pathv,
1643 (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
1645 if (new_gl_pathv == NULL)
1650 struct globnames *old = names;
1651 for (size_t i = 0; i < cur; ++i)
1652 free (names->name[i]);
1653 names = names->next;
1654 /* NB: we will not leak memory here if we exit without
1655 freeing the current block assigned to OLD. At least
1656 the very first block is always allocated on the stack
1657 and this is the block assigned to OLD here. */
1660 assert (old == &init_names);
1664 if (old == names_alloca)
1665 names_alloca = names;
1669 result = GLOB_NOSPACE;
1675 struct globnames *old = names;
1676 for (size_t i = 0; i < cur; ++i)
1677 new_gl_pathv[pglob->gl_offs + pglob->gl_pathc++]
1679 names = names->next;
1680 /* NB: we will not leak memory here if we exit without
1681 freeing the current block assigned to OLD. At least
1682 the very first block is always allocated on the stack
1683 and this is the block assigned to OLD here. */
1686 assert (old == &init_names);
1690 if (old == names_alloca)
1691 names_alloca = names;
1696 pglob->gl_pathv = new_gl_pathv;
1698 pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
1700 pglob->gl_flags = flags;
1707 if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
1708 (*pglob->gl_closedir) (stream);