1 /* Copyright (C) 1991-2015 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
25 #include <sys/types.h>
29 /* Outcomment the following line for production quality code. */
30 /* #define NDEBUG 1 */
33 #include <stdio.h> /* Needed on stupid SunOS for assert. */
35 #if !defined _LIBC || !defined GLOB_ONLY_P
36 #if defined HAVE_UNISTD_H || defined _LIBC
39 # ifdef _POSIX_VERSION
47 #if defined HAVE_STDINT_H || defined _LIBC
49 #elif !defined UINTPTR_MAX
50 # define UINTPTR_MAX (~((size_t) 0))
55 # define __set_errno(val) errno = (val)
58 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
60 # define NAMLEN(dirent) strlen((dirent)->d_name)
62 # define dirent direct
63 # define NAMLEN(dirent) (dirent)->d_namlen
64 # ifdef HAVE_SYS_NDIR_H
65 # include <sys/ndir.h>
67 # ifdef HAVE_SYS_DIR_H
75 # endif /* HAVE_VMSDIR_H */
79 /* In GNU systems, <dirent.h> defines this macro for us. */
82 # define NAMLEN(d) _D_NAMLEN(d)
85 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
86 if the `d_type' member for `struct dirent' is available.
87 HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
88 #if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
89 /* True if the directory entry D must be of type T. */
90 # define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
92 /* True if the directory entry D might be a symbolic link. */
93 # define DIRENT_MIGHT_BE_SYMLINK(d) \
94 ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
96 /* True if the directory entry D might be a directory. */
97 # define DIRENT_MIGHT_BE_DIR(d) \
98 ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
100 #else /* !HAVE_D_TYPE */
101 # define DIRENT_MUST_BE(d, t) false
102 # define DIRENT_MIGHT_BE_SYMLINK(d) true
103 # define DIRENT_MIGHT_BE_DIR(d) true
104 #endif /* HAVE_D_TYPE */
106 /* If the system has the `struct dirent64' type we use it internally. */
107 #if defined _LIBC && !defined COMPILE_GLOB64
108 # if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
109 # define CONVERT_D_NAMLEN(d64, d32)
111 # define CONVERT_D_NAMLEN(d64, d32) \
112 (d64)->d_namlen = (d32)->d_namlen;
115 # if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
116 # define CONVERT_D_INO(d64, d32)
118 # define CONVERT_D_INO(d64, d32) \
119 (d64)->d_ino = (d32)->d_ino;
122 # ifdef _DIRENT_HAVE_D_TYPE
123 # define CONVERT_D_TYPE(d64, d32) \
124 (d64)->d_type = (d32)->d_type;
126 # define CONVERT_D_TYPE(d64, d32)
129 # define CONVERT_DIRENT_DIRENT64(d64, d32) \
130 memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1); \
131 CONVERT_D_NAMLEN (d64, d32) \
132 CONVERT_D_INO (d64, d32) \
133 CONVERT_D_TYPE (d64, d32)
137 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
138 /* Posix does not require that the d_ino field be present, and some
139 systems do not provide it. */
140 # define REAL_DIR_ENTRY(dp) 1
142 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
148 /* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
151 # define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
158 # define strdup(str) __strdup (str)
159 # define sysconf(id) __sysconf (id)
160 # define closedir(dir) __closedir (dir)
161 # define opendir(name) __opendir (name)
162 # define readdir(str) __readdir64 (str)
163 # define getpwnam_r(name, bufp, buf, len, res) \
164 __getpwnam_r (name, bufp, buf, len, res)
166 # define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
168 # define struct_stat64 struct stat64
170 # include "getlogin_r.h"
171 # include "mempcpy.h"
172 # include "stat-macros.h"
174 # define __stat64(fname, buf) stat (fname, buf)
175 # define struct_stat64 struct stat
176 # define __stat(fname, buf) stat (fname, buf)
177 # define __alloca alloca
178 # define __readdir readdir
179 # define __readdir64 readdir64
180 # define __glob_pattern_p glob_pattern_p
185 #ifdef _SC_GETPW_R_SIZE_MAX
186 # define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
188 # define GETPW_R_SIZE_MAX() (-1)
190 #ifdef _SC_LOGIN_NAME_MAX
191 # define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
193 # define GET_LOGIN_NAME_MAX() (-1)
196 static const char *next_brace_sub (const char *begin
, int flags
) __THROWNL
;
198 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
200 #ifndef attribute_hidden
201 # define attribute_hidden
204 static int glob_in_dir (const char *pattern
, const char *directory
,
205 int flags
, int (*errfunc
) (const char *, int),
206 glob_t
*pglob
, size_t alloca_used
);
207 extern int __glob_pattern_type (const char *pattern
, int quote
)
210 #if !defined _LIBC || !defined GLOB_ONLY_P
211 static int prefix_array (const char *prefix
, char **array
, size_t n
) __THROWNL
;
212 static int collated_compare (const void *, const void *) __THROWNL
;
215 /* Find the end of the sub-pattern in a brace expression. */
217 next_brace_sub (const char *cp
, int flags
)
221 if ((flags
& GLOB_NOESCAPE
) == 0 && *cp
== '\\')
229 if ((*cp
== '}' && depth
-- == 0) || (*cp
== ',' && depth
== 0))
236 return *cp
!= '\0' ? cp
: NULL
;
239 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
241 /* Do glob searching for PATTERN, placing results in PGLOB.
242 The bits defined above may be set in FLAGS.
243 If a directory cannot be opened or read and ERRFUNC is not nil,
244 it is called with the pathname that caused the error, and the
245 `errno' value from the failing call; if it returns non-zero
246 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
247 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
248 Otherwise, `glob' returns zero. */
250 #ifdef GLOB_ATTRIBUTE
253 glob (pattern
, flags
, errfunc
, pglob
)
256 int (*errfunc
) (const char *, int);
259 const char *filename
;
260 char *dirname
= NULL
;
265 int dirname_modified
;
266 int malloc_dirname
= 0;
270 size_t alloca_used
= 0;
273 if (pattern
== NULL
|| pglob
== NULL
|| (flags
& ~__GLOB_FLAGS
) != 0)
275 __set_errno (EINVAL
);
279 /* POSIX requires all slashes to be matched. This means that with
280 a trailing slash we must match only directories. */
281 if (pattern
[0] && pattern
[strlen (pattern
) - 1] == '/')
282 flags
|= GLOB_ONLYDIR
;
284 if (!(flags
& GLOB_DOOFFS
))
285 /* Have to do this so `globfree' knows where to start freeing. It
286 also makes all the code that uses gl_offs simpler. */
289 if (flags
& GLOB_BRACE
)
293 if (flags
& GLOB_NOESCAPE
)
294 begin
= strchr (pattern
, '{');
306 if (*begin
== '\\' && begin
[1] != '\0')
308 else if (*begin
== '{')
317 /* Allocate working buffer large enough for our work. Note that
318 we have at least an opening and closing brace. */
326 size_t pattern_len
= strlen (pattern
) - 1;
328 int alloca_onealt
= __libc_use_alloca (alloca_used
+ pattern_len
);
330 onealt
= alloca_account (pattern_len
, alloca_used
);
334 onealt
= (char *) malloc (pattern_len
);
337 if (!(flags
& GLOB_APPEND
))
340 pglob
->gl_pathv
= NULL
;
346 /* We know the prefix for all sub-patterns. */
347 alt_start
= mempcpy (onealt
, pattern
, begin
- pattern
);
349 /* Find the first sub-pattern and at the same time find the
350 rest after the closing brace. */
351 next
= next_brace_sub (begin
+ 1, flags
);
354 /* It is an illegal expression. */
357 if (__glibc_unlikely (!alloca_onealt
))
360 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
363 /* Now find the end of the whole brace expression. */
367 rest
= next_brace_sub (rest
+ 1, flags
);
369 /* It is an illegal expression. */
372 /* Please note that we now can be sure the brace expression
374 rest_len
= strlen (++rest
) + 1;
376 /* We have a brace expression. BEGIN points to the opening {,
377 NEXT points past the terminator of the first element, and END
378 points past the final }. We will accumulate result names from
379 recursive runs for each brace alternative in the buffer using
382 if (!(flags
& GLOB_APPEND
))
384 /* This call is to set a new vector, so clear out the
385 vector so we can append to it. */
387 pglob
->gl_pathv
= NULL
;
389 firstc
= pglob
->gl_pathc
;
396 /* Construct the new glob expression. */
397 mempcpy (mempcpy (alt_start
, p
, next
- p
), rest
, rest_len
);
399 result
= glob (onealt
,
400 ((flags
& ~(GLOB_NOCHECK
| GLOB_NOMAGIC
))
401 | GLOB_APPEND
), errfunc
, pglob
);
403 /* If we got an error, return it. */
404 if (result
&& result
!= GLOB_NOMATCH
)
407 if (__glibc_unlikely (!alloca_onealt
))
410 if (!(flags
& GLOB_APPEND
))
419 /* We saw the last entry. */
423 next
= next_brace_sub (p
, flags
);
424 assert (next
!= NULL
);
428 if (__glibc_unlikely (!alloca_onealt
))
432 if (pglob
->gl_pathc
!= firstc
)
433 /* We found some entries. */
435 else if (!(flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
440 if (!(flags
& GLOB_APPEND
))
443 if (!(flags
& GLOB_DOOFFS
))
444 pglob
->gl_pathv
= NULL
;
449 if (pglob
->gl_offs
>= ~((size_t) 0) / sizeof (char *))
452 pglob
->gl_pathv
= (char **) malloc ((pglob
->gl_offs
+ 1)
454 if (pglob
->gl_pathv
== NULL
)
457 for (i
= 0; i
<= pglob
->gl_offs
; ++i
)
458 pglob
->gl_pathv
[i
] = NULL
;
462 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
464 /* Find the filename. */
465 filename
= strrchr (pattern
, '/');
466 #if defined __MSDOS__ || defined WINDOWS32
467 /* The case of "d:pattern". Since `:' is not allowed in
468 file names, we can safely assume that wherever it
469 happens in pattern, it signals the filename part. This
470 is so we could some day support patterns like "[a-z]:foo". */
471 if (filename
== NULL
)
472 filename
= strchr (pattern
, ':');
473 #endif /* __MSDOS__ || WINDOWS32 */
474 dirname_modified
= 0;
475 if (filename
== NULL
)
477 /* This can mean two things: a simple name or "~name". The latter
478 case is nothing but a notation for a directory. */
479 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && pattern
[0] == '~')
481 dirname
= (char *) pattern
;
482 dirlen
= strlen (pattern
);
484 /* Set FILENAME to NULL as a special flag. This is ugly but
485 other solutions would require much more code. We test for
486 this special case below. */
491 if (__glibc_unlikely (pattern
[0] == '\0'))
493 dirs
.gl_pathv
= NULL
;
499 dirname
= (char *) "";
501 dirname
= (char *) ".";
506 else if (filename
== pattern
507 || (filename
== pattern
+ 1 && pattern
[0] == '\\'
508 && (flags
& GLOB_NOESCAPE
) == 0))
510 /* "/pattern" or "\\/pattern". */
511 dirname
= (char *) "/";
518 dirlen
= filename
- pattern
;
519 #if defined __MSDOS__ || defined WINDOWS32
521 || (filename
> pattern
+ 1 && filename
[-1] == ':'))
526 drive_spec
= (char *) __alloca (dirlen
+ 1);
527 *((char *) mempcpy (drive_spec
, pattern
, dirlen
)) = '\0';
528 /* For now, disallow wildcards in the drive spec, to
529 prevent infinite recursion in glob. */
530 if (__glob_pattern_p (drive_spec
, !(flags
& GLOB_NOESCAPE
)))
532 /* If this is "d:pattern", we need to copy `:' to DIRNAME
533 as well. If it's "d:/pattern", don't remove the slash
534 from "d:/", since "d:" and "d:/" are not the same.*/
538 if (__libc_use_alloca (alloca_used
+ dirlen
+ 1))
539 newp
= alloca_account (dirlen
+ 1, alloca_used
);
543 newp
= malloc (dirlen
+ 1);
548 *((char *) mempcpy (newp
, pattern
, dirlen
)) = '\0';
552 if (filename
[0] == '\0'
553 #if defined __MSDOS__ || defined WINDOWS32
554 && dirname
[dirlen
- 1] != ':'
555 && (dirlen
< 3 || dirname
[dirlen
- 2] != ':'
556 || dirname
[dirlen
- 1] != '/')
559 /* "pattern/". Expand "pattern", appending slashes. */
561 int orig_flags
= flags
;
562 if (!(flags
& GLOB_NOESCAPE
) && dirname
[dirlen
- 1] == '\\')
564 /* "pattern\\/". Remove the final backslash if it hasn't
566 char *p
= (char *) &dirname
[dirlen
- 1];
568 while (p
> dirname
&& p
[-1] == '\\') --p
;
569 if ((&dirname
[dirlen
] - p
) & 1)
571 *(char *) &dirname
[--dirlen
] = '\0';
572 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
575 int val
= glob (dirname
, flags
| GLOB_MARK
, errfunc
, pglob
);
577 pglob
->gl_flags
= ((pglob
->gl_flags
& ~GLOB_MARK
)
578 | (flags
& GLOB_MARK
));
579 else if (val
== GLOB_NOMATCH
&& flags
!= orig_flags
)
581 /* Make sure globfree (&dirs); is a nop. */
582 dirs
.gl_pathv
= NULL
;
584 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
593 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && dirname
[0] == '~')
595 if (dirname
[1] == '\0' || dirname
[1] == '/'
596 || (!(flags
& GLOB_NOESCAPE
) && dirname
[1] == '\\'
597 && (dirname
[2] == '\0' || dirname
[2] == '/')))
599 /* Look up home directory. */
600 char *home_dir
= getenv ("HOME");
601 int malloc_home_dir
= 0;
603 if (home_dir
== NULL
|| home_dir
[0] == '\0')
607 if (home_dir
== NULL
|| home_dir
[0] == '\0')
608 home_dir
= "c:/users/default"; /* poor default */
610 if (home_dir
== NULL
|| home_dir
[0] == '\0')
614 size_t buflen
= GET_LOGIN_NAME_MAX () + 1;
617 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
620 name
= alloca_account (buflen
, alloca_used
);
622 success
= getlogin_r (name
, buflen
) == 0;
626 # if defined HAVE_GETPWNAM_R || defined _LIBC
627 long int pwbuflen
= GETPW_R_SIZE_MAX ();
630 int malloc_pwtmpbuf
= 0;
635 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
636 Try a moderate value. */
639 if (__libc_use_alloca (alloca_used
+ pwbuflen
))
640 pwtmpbuf
= alloca_account (pwbuflen
, alloca_used
);
643 pwtmpbuf
= malloc (pwbuflen
);
644 if (pwtmpbuf
== NULL
)
646 retval
= GLOB_NOSPACE
;
652 while (getpwnam_r (name
, &pwbuf
, pwtmpbuf
, pwbuflen
, &p
)
662 && __libc_use_alloca (alloca_used
664 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, pwbuflen
,
669 char *newp
= realloc (malloc_pwtmpbuf
674 if (__glibc_unlikely (malloc_pwtmpbuf
))
676 retval
= GLOB_NOSPACE
;
680 pwbuflen
= 2 * pwbuflen
;
690 if (!malloc_pwtmpbuf
)
691 home_dir
= p
->pw_dir
;
694 size_t home_dir_len
= strlen (p
->pw_dir
) + 1;
695 if (__libc_use_alloca (alloca_used
+ home_dir_len
))
696 home_dir
= alloca_account (home_dir_len
,
700 home_dir
= malloc (home_dir_len
);
701 if (home_dir
== NULL
)
704 retval
= GLOB_NOSPACE
;
709 memcpy (home_dir
, p
->pw_dir
, home_dir_len
);
716 if (home_dir
== NULL
|| home_dir
[0] == '\0')
718 if (flags
& GLOB_TILDE_CHECK
)
720 if (__glibc_unlikely (malloc_home_dir
))
722 retval
= GLOB_NOMATCH
;
726 home_dir
= (char *) "~"; /* No luck. */
728 # endif /* WINDOWS32 */
730 /* Now construct the full directory. */
731 if (dirname
[1] == '\0')
733 if (__glibc_unlikely (malloc_dirname
))
737 dirlen
= strlen (dirname
);
738 malloc_dirname
= malloc_home_dir
;
743 size_t home_len
= strlen (home_dir
);
744 int use_alloca
= __libc_use_alloca (alloca_used
745 + home_len
+ dirlen
);
747 newp
= alloca_account (home_len
+ dirlen
, alloca_used
);
750 newp
= malloc (home_len
+ dirlen
);
753 if (__glibc_unlikely (malloc_home_dir
))
755 retval
= GLOB_NOSPACE
;
760 mempcpy (mempcpy (newp
, home_dir
, home_len
),
761 &dirname
[1], dirlen
);
763 if (__glibc_unlikely (malloc_dirname
))
767 dirlen
+= home_len
- 1;
768 malloc_dirname
= !use_alloca
;
770 dirname_modified
= 1;
772 # if !defined _AMIGA && !defined WINDOWS32
775 char *end_name
= strchr (dirname
, '/');
777 int malloc_user_name
= 0;
778 char *unescape
= NULL
;
780 if (!(flags
& GLOB_NOESCAPE
))
782 if (end_name
== NULL
)
784 unescape
= strchr (dirname
, '\\');
786 end_name
= strchr (unescape
, '\0');
789 unescape
= memchr (dirname
, '\\', end_name
- dirname
);
791 if (end_name
== NULL
)
792 user_name
= dirname
+ 1;
796 if (__libc_use_alloca (alloca_used
+ (end_name
- dirname
)))
797 newp
= alloca_account (end_name
- dirname
, alloca_used
);
800 newp
= malloc (end_name
- dirname
);
803 retval
= GLOB_NOSPACE
;
806 malloc_user_name
= 1;
808 if (unescape
!= NULL
)
810 char *p
= mempcpy (newp
, dirname
+ 1,
811 unescape
- dirname
- 1);
819 /* "~fo\\o\\" unescape to user_name "foo\\",
820 but "~fo\\o\\/" unescape to user_name
822 if (filename
== NULL
)
833 *((char *) mempcpy (newp
, dirname
+ 1, end_name
- dirname
))
838 /* Look up specific user's home directory. */
841 # if defined HAVE_GETPWNAM_R || defined _LIBC
842 long int buflen
= GETPW_R_SIZE_MAX ();
844 int malloc_pwtmpbuf
= 0;
850 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
854 if (__libc_use_alloca (alloca_used
+ buflen
))
855 pwtmpbuf
= alloca_account (buflen
, alloca_used
);
858 pwtmpbuf
= malloc (buflen
);
859 if (pwtmpbuf
== NULL
)
862 if (__glibc_unlikely (malloc_user_name
))
864 retval
= GLOB_NOSPACE
;
870 while (getpwnam_r (user_name
, &pwbuf
, pwtmpbuf
, buflen
, &p
) != 0)
878 && __libc_use_alloca (alloca_used
+ 2 * buflen
))
879 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, buflen
,
880 2 * buflen
, alloca_used
);
883 char *newp
= realloc (malloc_pwtmpbuf
? pwtmpbuf
: NULL
,
887 if (__glibc_unlikely (malloc_pwtmpbuf
))
897 p
= getpwnam (user_name
);
900 if (__glibc_unlikely (malloc_user_name
))
903 /* If we found a home directory use this. */
906 size_t home_len
= strlen (p
->pw_dir
);
907 size_t rest_len
= end_name
== NULL
? 0 : strlen (end_name
);
909 if (__glibc_unlikely (malloc_dirname
))
913 if (__libc_use_alloca (alloca_used
+ home_len
+ rest_len
+ 1))
914 dirname
= alloca_account (home_len
+ rest_len
+ 1,
918 dirname
= malloc (home_len
+ rest_len
+ 1);
921 if (__glibc_unlikely (malloc_pwtmpbuf
))
923 retval
= GLOB_NOSPACE
;
928 *((char *) mempcpy (mempcpy (dirname
, p
->pw_dir
, home_len
),
929 end_name
, rest_len
)) = '\0';
931 dirlen
= home_len
+ rest_len
;
932 dirname_modified
= 1;
934 if (__glibc_unlikely (malloc_pwtmpbuf
))
939 if (__glibc_unlikely (malloc_pwtmpbuf
))
942 if (flags
& GLOB_TILDE_CHECK
)
943 /* We have to regard it as an error if we cannot find the
949 # endif /* Not Amiga && not WINDOWS32. */
951 #endif /* Not VMS. */
953 /* Now test whether we looked for "~" or "~NAME". In this case we
954 can give the answer now. */
955 if (filename
== NULL
)
960 /* Return the directory if we don't check for error or if it exists. */
961 if ((flags
& GLOB_NOCHECK
)
962 || (((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
963 ? ((*pglob
->gl_stat
) (dirname
, &st
) == 0
964 && S_ISDIR (st
.st_mode
))
965 : (__stat64 (dirname
, &st64
) == 0 && S_ISDIR (st64
.st_mode
)))))
967 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
970 if (newcount
> UINTPTR_MAX
- (1 + 1)
971 || newcount
+ 1 + 1 > ~((size_t) 0) / sizeof (char *))
974 free (pglob
->gl_pathv
);
975 pglob
->gl_pathv
= NULL
;
981 = (char **) realloc (pglob
->gl_pathv
,
982 (newcount
+ 1 + 1) * sizeof (char *));
983 if (new_gl_pathv
== NULL
)
985 pglob
->gl_pathv
= new_gl_pathv
;
987 if (flags
& GLOB_MARK
)
990 pglob
->gl_pathv
[newcount
] = malloc (dirlen
+ 2);
991 if (pglob
->gl_pathv
[newcount
] == NULL
)
993 p
= mempcpy (pglob
->gl_pathv
[newcount
], dirname
, dirlen
);
999 pglob
->gl_pathv
[newcount
] = strdup (dirname
);
1000 if (pglob
->gl_pathv
[newcount
] == NULL
)
1003 pglob
->gl_pathv
[++newcount
] = NULL
;
1005 pglob
->gl_flags
= flags
;
1011 return GLOB_NOMATCH
;
1014 meta
= __glob_pattern_type (dirname
, !(flags
& GLOB_NOESCAPE
));
1015 /* meta is 1 if correct glob pattern containing metacharacters.
1016 If meta has bit (1 << 2) set, it means there was an unterminated
1017 [ which we handle the same, using fnmatch. Broken unterminated
1018 pattern bracket expressions ought to be rare enough that it is
1019 not worth special casing them, fnmatch will do the right thing. */
1022 /* The directory name contains metacharacters, so we
1023 have to glob for the directory, and then glob for
1024 the pattern in each directory found. */
1027 if (!(flags
& GLOB_NOESCAPE
) && dirlen
> 0 && dirname
[dirlen
- 1] == '\\')
1029 /* "foo\\/bar". Remove the final backslash from dirname
1030 if it has not been quoted. */
1031 char *p
= (char *) &dirname
[dirlen
- 1];
1033 while (p
> dirname
&& p
[-1] == '\\') --p
;
1034 if ((&dirname
[dirlen
] - p
) & 1)
1035 *(char *) &dirname
[--dirlen
] = '\0';
1038 if (__glibc_unlikely ((flags
& GLOB_ALTDIRFUNC
) != 0))
1040 /* Use the alternative access functions also in the recursive
1042 dirs
.gl_opendir
= pglob
->gl_opendir
;
1043 dirs
.gl_readdir
= pglob
->gl_readdir
;
1044 dirs
.gl_closedir
= pglob
->gl_closedir
;
1045 dirs
.gl_stat
= pglob
->gl_stat
;
1046 dirs
.gl_lstat
= pglob
->gl_lstat
;
1049 status
= glob (dirname
,
1050 ((flags
& (GLOB_ERR
| GLOB_NOESCAPE
1052 | GLOB_NOSORT
| GLOB_ONLYDIR
),
1056 if ((flags
& GLOB_NOCHECK
) == 0 || status
!= GLOB_NOMATCH
)
1061 /* We have successfully globbed the preceding directory name.
1062 For each name we found, call glob_in_dir on it and FILENAME,
1063 appending the results to PGLOB. */
1064 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
1070 /* Make globbing interruptible in the bash shell. */
1071 extern int interrupt_state
;
1073 if (interrupt_state
)
1076 return GLOB_ABORTED
;
1081 old_pathc
= pglob
->gl_pathc
;
1082 status
= glob_in_dir (filename
, dirs
.gl_pathv
[i
],
1083 ((flags
| GLOB_APPEND
)
1084 & ~(GLOB_NOCHECK
| GLOB_NOMAGIC
)),
1085 errfunc
, pglob
, alloca_used
);
1086 if (status
== GLOB_NOMATCH
)
1087 /* No matches in this directory. Try the next. */
1094 pglob
->gl_pathc
= 0;
1098 /* Stick the directory on the front of each name. */
1099 if (prefix_array (dirs
.gl_pathv
[i
],
1100 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1101 pglob
->gl_pathc
- old_pathc
))
1105 pglob
->gl_pathc
= 0;
1106 return GLOB_NOSPACE
;
1110 flags
|= GLOB_MAGCHAR
;
1112 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
1113 But if we have not found any matching entry and the GLOB_NOCHECK
1114 flag was set we must return the input pattern itself. */
1115 if (pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1119 if (flags
& GLOB_NOCHECK
)
1121 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
1122 char **new_gl_pathv
;
1124 if (newcount
> UINTPTR_MAX
- 2
1125 || newcount
+ 2 > ~((size_t) 0) / sizeof (char *))
1129 return GLOB_NOSPACE
;
1132 new_gl_pathv
= (char **) realloc (pglob
->gl_pathv
,
1135 if (new_gl_pathv
== NULL
)
1137 pglob
->gl_pathv
= new_gl_pathv
;
1139 pglob
->gl_pathv
[newcount
] = __strdup (pattern
);
1140 if (pglob
->gl_pathv
[newcount
] == NULL
)
1144 pglob
->gl_pathc
= 0;
1145 return GLOB_NOSPACE
;
1151 pglob
->gl_pathv
[newcount
] = NULL
;
1152 pglob
->gl_flags
= flags
;
1157 return GLOB_NOMATCH
;
1165 size_t old_pathc
= pglob
->gl_pathc
;
1166 int orig_flags
= flags
;
1170 char *p
= strchr (dirname
, '\\'), *q
;
1171 /* We need to unescape the dirname string. It is certainly
1172 allocated by alloca, as otherwise filename would be NULL
1173 or dirname wouldn't contain backslashes. */
1186 while (*p
++ != '\0');
1187 dirname_modified
= 1;
1189 if (dirname_modified
)
1190 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
1191 status
= glob_in_dir (filename
, dirname
, flags
, errfunc
, pglob
,
1195 if (status
== GLOB_NOMATCH
&& flags
!= orig_flags
1196 && pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1198 /* Make sure globfree (&dirs); is a nop. */
1199 dirs
.gl_pathv
= NULL
;
1208 /* Stick the directory on the front of each name. */
1209 if (prefix_array (dirname
,
1210 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1211 pglob
->gl_pathc
- old_pathc
))
1214 pglob
->gl_pathc
= 0;
1215 return GLOB_NOSPACE
;
1220 if (flags
& GLOB_MARK
)
1222 /* Append slashes to directory names. */
1227 for (i
= oldcount
; i
< pglob
->gl_pathc
+ pglob
->gl_offs
; ++i
)
1228 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1229 ? ((*pglob
->gl_stat
) (pglob
->gl_pathv
[i
], &st
) == 0
1230 && S_ISDIR (st
.st_mode
))
1231 : (__stat64 (pglob
->gl_pathv
[i
], &st64
) == 0
1232 && S_ISDIR (st64
.st_mode
))))
1234 size_t len
= strlen (pglob
->gl_pathv
[i
]) + 2;
1235 char *new = realloc (pglob
->gl_pathv
[i
], len
);
1239 pglob
->gl_pathc
= 0;
1240 return GLOB_NOSPACE
;
1242 strcpy (&new[len
- 2], "/");
1243 pglob
->gl_pathv
[i
] = new;
1247 if (!(flags
& GLOB_NOSORT
))
1249 /* Sort the vector. */
1250 qsort (&pglob
->gl_pathv
[oldcount
],
1251 pglob
->gl_pathc
+ pglob
->gl_offs
- oldcount
,
1252 sizeof (char *), collated_compare
);
1256 if (__glibc_unlikely (malloc_dirname
))
1261 #if defined _LIBC && !defined glob
1262 libc_hidden_def (glob
)
1266 #if !defined _LIBC || !defined GLOB_ONLY_P
1268 /* Free storage allocated in PGLOB by a previous `glob' call. */
1273 if (pglob
->gl_pathv
!= NULL
)
1276 for (i
= 0; i
< pglob
->gl_pathc
; ++i
)
1277 free (pglob
->gl_pathv
[pglob
->gl_offs
+ i
]);
1278 free (pglob
->gl_pathv
);
1279 pglob
->gl_pathv
= NULL
;
1282 #if defined _LIBC && !defined globfree
1283 libc_hidden_def (globfree
)
1287 /* Do a collated comparison of A and B. */
1289 collated_compare (const void *a
, const void *b
)
1291 const char *const s1
= *(const char *const * const) a
;
1292 const char *const s2
= *(const char *const * const) b
;
1300 return strcoll (s1
, s2
);
1304 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1305 elements in place. Return nonzero if out of memory, zero if successful.
1306 A slash is inserted between DIRNAME and each elt of ARRAY,
1307 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1309 prefix_array (const char *dirname
, char **array
, size_t n
)
1312 size_t dirlen
= strlen (dirname
);
1313 #if defined __MSDOS__ || defined WINDOWS32
1315 # define DIRSEP_CHAR sep_char
1317 # define DIRSEP_CHAR '/'
1320 if (dirlen
== 1 && dirname
[0] == '/')
1321 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1322 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1324 #if defined __MSDOS__ || defined WINDOWS32
1325 else if (dirlen
> 1)
1327 if (dirname
[dirlen
- 1] == '/' && dirname
[dirlen
- 2] == ':')
1328 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1330 else if (dirname
[dirlen
- 1] == ':')
1332 /* DIRNAME is "d:". Use `:' instead of `/'. */
1339 for (i
= 0; i
< n
; ++i
)
1341 size_t eltlen
= strlen (array
[i
]) + 1;
1342 char *new = (char *) malloc (dirlen
+ 1 + eltlen
);
1351 char *endp
= mempcpy (new, dirname
, dirlen
);
1352 *endp
++ = DIRSEP_CHAR
;
1353 mempcpy (endp
, array
[i
], eltlen
);
1363 /* We must not compile this function twice. */
1364 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1366 __glob_pattern_type (pattern
, quote
)
1367 const char *pattern
;
1373 for (p
= pattern
; *p
!= '\0'; ++p
)
1402 /* Return nonzero if PATTERN contains any metacharacters.
1403 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1405 __glob_pattern_p (pattern
, quote
)
1406 const char *pattern
;
1409 return __glob_pattern_type (pattern
, quote
) == 1;
1412 weak_alias (__glob_pattern_p
, glob_pattern_p
)
1416 #endif /* !GLOB_ONLY_P */
1419 /* We put this in a separate function mainly to allow the memory
1420 allocated with alloca to be recycled. */
1421 #if !defined _LIBC || !defined GLOB_ONLY_P
1423 __attribute_noinline__
1424 link_exists2_p (const char *dir
, size_t dirlen
, const char *fname
,
1431 size_t fnamelen
= strlen (fname
);
1432 char *fullname
= (char *) __alloca (dirlen
+ 1 + fnamelen
+ 1);
1438 mempcpy (mempcpy (mempcpy (fullname
, dir
, dirlen
), "/", 1),
1439 fname
, fnamelen
+ 1);
1442 return (*pglob
->gl_stat
) (fullname
, &st
) == 0;
1444 return ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1445 ? (*pglob
->gl_stat
) (fullname
, &st
)
1446 : __stat64 (fullname
, &st64
)) == 0);
1450 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1451 (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) \
1452 ? link_exists2_p (dirname, dirnamelen, fname, pglob) \
1453 : ({ struct stat64 st64; \
1454 __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0; }))
1456 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1457 link_exists2_p (dirname, dirnamelen, fname, pglob, flags)
1462 /* Like `glob', but PATTERN is a final pathname component,
1463 and matches are searched for in DIRECTORY.
1464 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1465 The GLOB_APPEND flag is assumed to be set (always appends). */
1467 glob_in_dir (const char *pattern
, const char *directory
, int flags
,
1468 int (*errfunc
) (const char *, int),
1469 glob_t
*pglob
, size_t alloca_used
)
1471 size_t dirlen
= strlen (directory
);
1472 void *stream
= NULL
;
1475 struct globnames
*next
;
1479 #define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
1480 struct globnames init_names
;
1481 struct globnames
*names
= &init_names
;
1482 struct globnames
*names_alloca
= &init_names
;
1488 alloca_used
+= sizeof (init_names
);
1490 init_names
.next
= NULL
;
1491 init_names
.count
= INITIAL_COUNT
;
1493 meta
= __glob_pattern_type (pattern
, !(flags
& GLOB_NOESCAPE
));
1494 if (meta
== 0 && (flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
1496 /* We need not do any tests. The PATTERN contains no meta
1497 characters and we must not return an error therefore the
1498 result will always contain exactly one name. */
1499 flags
|= GLOB_NOCHECK
;
1503 /* Since we use the normal file functions we can also use stat()
1504 to verify the file is there. */
1510 size_t patlen
= strlen (pattern
);
1511 int alloca_fullname
= __libc_use_alloca (alloca_used
1512 + dirlen
+ 1 + patlen
+ 1);
1514 if (alloca_fullname
)
1515 fullname
= alloca_account (dirlen
+ 1 + patlen
+ 1, alloca_used
);
1518 fullname
= malloc (dirlen
+ 1 + patlen
+ 1);
1519 if (fullname
== NULL
)
1520 return GLOB_NOSPACE
;
1523 mempcpy (mempcpy (mempcpy (fullname
, directory
, dirlen
),
1525 pattern
, patlen
+ 1);
1526 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1527 ? (*pglob
->gl_stat
) (fullname
, &ust
.st
)
1528 : __stat64 (fullname
, &ust
.st64
)) == 0)
1529 /* We found this file to be existing. Now tell the rest
1530 of the function to copy this name into the result. */
1531 flags
|= GLOB_NOCHECK
;
1533 if (__glibc_unlikely (!alloca_fullname
))
1538 stream
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1539 ? (*pglob
->gl_opendir
) (directory
)
1540 : opendir (directory
));
1543 if (errno
!= ENOTDIR
1544 && ((errfunc
!= NULL
&& (*errfunc
) (directory
, errno
))
1545 || (flags
& GLOB_ERR
)))
1546 return GLOB_ABORTED
;
1551 int dfd
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1552 ? -1 : dirfd ((DIR *) stream
));
1554 int fnm_flags
= ((!(flags
& GLOB_PERIOD
) ? FNM_PERIOD
: 0)
1555 | ((flags
& GLOB_NOESCAPE
) ? FNM_NOESCAPE
: 0)
1556 #if defined _AMIGA || defined VMS
1560 flags
|= GLOB_MAGCHAR
;
1566 #if defined _LIBC && !defined COMPILE_GLOB64
1570 struct dirent64 d64
;
1571 char room
[offsetof (struct dirent64
, d_name
[0])
1576 if (__glibc_unlikely (flags
& GLOB_ALTDIRFUNC
))
1578 struct dirent
*d32
= (*pglob
->gl_readdir
) (stream
);
1581 CONVERT_DIRENT_DIRENT64 (&d64buf
.d64
, d32
);
1588 d
= __readdir64 (stream
);
1590 struct dirent
*d
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1591 ? ((struct dirent
*)
1592 (*pglob
->gl_readdir
) (stream
))
1593 : __readdir (stream
));
1597 if (! REAL_DIR_ENTRY (d
))
1600 /* If we shall match only directories use the information
1601 provided by the dirent call if possible. */
1602 if ((flags
& GLOB_ONLYDIR
) && !DIRENT_MIGHT_BE_DIR (d
))
1607 if (fnmatch (pattern
, name
, fnm_flags
) == 0)
1609 /* If the file we found is a symlink we have to
1610 make sure the target file exists. */
1611 if (!DIRENT_MIGHT_BE_SYMLINK (d
)
1612 || link_exists_p (dfd
, directory
, dirlen
, name
, pglob
,
1615 if (cur
== names
->count
)
1617 struct globnames
*newnames
;
1618 size_t count
= names
->count
* 2;
1619 size_t size
= (sizeof (struct globnames
)
1620 + ((count
- INITIAL_COUNT
)
1621 * sizeof (char *)));
1622 if (__libc_use_alloca (alloca_used
+ size
))
1623 newnames
= names_alloca
1624 = alloca_account (size
, alloca_used
);
1625 else if ((newnames
= malloc (size
))
1628 newnames
->count
= count
;
1629 newnames
->next
= names
;
1634 names
->name
[cur
] = (char *) malloc (len
+ 1);
1635 if (names
->name
[cur
] == NULL
)
1637 *((char *) mempcpy (names
->name
[cur
++], name
, len
))
1646 if (nfound
== 0 && (flags
& GLOB_NOCHECK
))
1648 size_t len
= strlen (pattern
);
1650 names
->name
[cur
] = (char *) malloc (len
+ 1);
1651 if (names
->name
[cur
] == NULL
)
1653 *((char *) mempcpy (names
->name
[cur
++], pattern
, len
)) = '\0';
1656 int result
= GLOB_NOMATCH
;
1661 if (pglob
->gl_pathc
> UINTPTR_MAX
- pglob
->gl_offs
1662 || pglob
->gl_pathc
+ pglob
->gl_offs
> UINTPTR_MAX
- nfound
1663 || pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
> UINTPTR_MAX
- 1
1664 || (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1
1665 > UINTPTR_MAX
/ sizeof (char *)))
1668 char **new_gl_pathv
;
1670 = (char **) realloc (pglob
->gl_pathv
,
1671 (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1)
1673 if (new_gl_pathv
== NULL
)
1678 struct globnames
*old
= names
;
1679 for (size_t i
= 0; i
< cur
; ++i
)
1680 free (names
->name
[i
]);
1681 names
= names
->next
;
1682 /* NB: we will not leak memory here if we exit without
1683 freeing the current block assigned to OLD. At least
1684 the very first block is always allocated on the stack
1685 and this is the block assigned to OLD here. */
1688 assert (old
== &init_names
);
1692 if (old
== names_alloca
)
1693 names_alloca
= names
;
1697 result
= GLOB_NOSPACE
;
1703 struct globnames
*old
= names
;
1704 for (size_t i
= 0; i
< cur
; ++i
)
1705 new_gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
++]
1707 names
= names
->next
;
1708 /* NB: we will not leak memory here if we exit without
1709 freeing the current block assigned to OLD. At least
1710 the very first block is always allocated on the stack
1711 and this is the block assigned to OLD here. */
1714 assert (old
== &init_names
);
1718 if (old
== names_alloca
)
1719 names_alloca
= names
;
1724 pglob
->gl_pathv
= new_gl_pathv
;
1726 pglob
->gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
] = NULL
;
1728 pglob
->gl_flags
= flags
;
1735 if (__glibc_unlikely (flags
& GLOB_ALTDIRFUNC
))
1736 (*pglob
->gl_closedir
) (stream
);