1 /* Copyright (C) 1991-2016 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>
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
49 #if defined HAVE_STDINT_H || defined _LIBC
51 #elif !defined UINTPTR_MAX
52 # define UINTPTR_MAX (~((size_t) 0))
57 # define __set_errno(val) errno = (val)
60 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
63 # define dirent direct
64 # ifdef HAVE_SYS_NDIR_H
65 # include <sys/ndir.h>
67 # ifdef HAVE_SYS_DIR_H
75 # endif /* HAVE_VMSDIR_H */
84 # define strdup(str) __strdup (str)
85 # define sysconf(id) __sysconf (id)
86 # define closedir(dir) __closedir (dir)
87 # define opendir(name) __opendir (name)
88 # define readdir(str) __readdir64 (str)
89 # define getpwnam_r(name, bufp, buf, len, res) \
90 __getpwnam_r (name, bufp, buf, len, res)
92 # define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
94 # define struct_stat64 struct stat64
96 # include "getlogin_r.h"
98 # include "stat-macros.h"
100 # define __stat64(fname, buf) stat (fname, buf)
101 # define struct_stat64 struct stat
102 # define __stat(fname, buf) stat (fname, buf)
103 # define __alloca alloca
104 # define __readdir readdir
105 # define __readdir64 readdir64
106 # define __glob_pattern_p glob_pattern_p
111 #ifdef _SC_GETPW_R_SIZE_MAX
112 # define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
114 # define GETPW_R_SIZE_MAX() (-1)
116 #ifdef _SC_LOGIN_NAME_MAX
117 # define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
119 # define GET_LOGIN_NAME_MAX() (-1)
122 static const char *next_brace_sub (const char *begin
, int flags
) __THROWNL
;
124 /* A representation of a directory entry which does not depend on the
125 layout of struct dirent, or the size of ino_t. */
126 struct readdir_result
129 # if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
135 # if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
136 /* Initializer based on the d_type member of struct dirent. */
137 # define D_TYPE_TO_RESULT(source) (source)->d_type,
139 /* True if the directory entry D might be a symbolic link. */
141 readdir_result_might_be_symlink (struct readdir_result d
)
143 return d
.type
== DT_UNKNOWN
|| d
.type
== DT_LNK
;
146 /* True if the directory entry D might be a directory. */
148 readdir_result_might_be_dir (struct readdir_result d
)
150 return d
.type
== DT_DIR
|| readdir_result_might_be_symlink (d
);
152 # else /* defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE */
153 # define D_TYPE_TO_RESULT(source)
155 /* If we do not have type information, symbolic links and directories
156 are always a possibility. */
159 readdir_result_might_be_symlink (struct readdir_result d
)
165 readdir_result_might_be_dir (struct readdir_result d
)
170 # endif /* defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE */
172 # if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
173 /* Initializer for skip_entry. POSIX does not require that the d_ino
174 field be present, and some systems do not provide it. */
175 # define D_INO_TO_RESULT(source) false,
177 # define D_INO_TO_RESULT(source) (source)->d_ino == 0,
180 /* Construct an initializer for a struct readdir_result object from a
181 struct dirent *. No copy of the name is made. */
182 #define READDIR_RESULT_INITIALIZER(source) \
185 D_TYPE_TO_RESULT (source) \
186 D_INO_TO_RESULT (source) \
189 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
191 /* Call gl_readdir on STREAM. This macro can be overridden to reduce
192 type safety if an old interface version needs to be supported. */
194 # define GL_READDIR(pglob, stream) ((pglob)->gl_readdir (stream))
197 /* Extract name and type from directory entry. No copy of the name is
198 made. If SOURCE is NULL, result name is NULL. Keep in sync with
199 convert_dirent64 below. */
200 static struct readdir_result
201 convert_dirent (const struct dirent
*source
)
205 struct readdir_result result
= { NULL
, };
208 struct readdir_result result
= READDIR_RESULT_INITIALIZER (source
);
212 #ifndef COMPILE_GLOB64
213 /* Like convert_dirent, but works on struct dirent64 instead. Keep in
214 sync with convert_dirent above. */
215 static struct readdir_result
216 convert_dirent64 (const struct dirent64
*source
)
220 struct readdir_result result
= { NULL
, };
223 struct readdir_result result
= READDIR_RESULT_INITIALIZER (source
);
229 #ifndef attribute_hidden
230 # define attribute_hidden
233 static int glob_in_dir (const char *pattern
, const char *directory
,
234 int flags
, int (*errfunc
) (const char *, int),
235 glob_t
*pglob
, size_t alloca_used
);
236 extern int __glob_pattern_type (const char *pattern
, int quote
)
239 #if !defined _LIBC || !defined GLOB_ONLY_P
240 static int prefix_array (const char *prefix
, char **array
, size_t n
) __THROWNL
;
241 static int collated_compare (const void *, const void *) __THROWNL
;
244 /* Find the end of the sub-pattern in a brace expression. */
246 next_brace_sub (const char *cp
, int flags
)
250 if ((flags
& GLOB_NOESCAPE
) == 0 && *cp
== '\\')
258 if ((*cp
== '}' && depth
-- == 0) || (*cp
== ',' && depth
== 0))
265 return *cp
!= '\0' ? cp
: NULL
;
268 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
270 /* Do glob searching for PATTERN, placing results in PGLOB.
271 The bits defined above may be set in FLAGS.
272 If a directory cannot be opened or read and ERRFUNC is not nil,
273 it is called with the pathname that caused the error, and the
274 `errno' value from the failing call; if it returns non-zero
275 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
276 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
277 Otherwise, `glob' returns zero. */
279 #ifdef GLOB_ATTRIBUTE
282 glob (const char *pattern
, int flags
, int (*errfunc
) (const char *, int),
285 const char *filename
;
286 char *dirname
= NULL
;
291 int dirname_modified
;
292 int malloc_dirname
= 0;
296 size_t alloca_used
= 0;
299 if (pattern
== NULL
|| pglob
== NULL
|| (flags
& ~__GLOB_FLAGS
) != 0)
301 __set_errno (EINVAL
);
305 /* POSIX requires all slashes to be matched. This means that with
306 a trailing slash we must match only directories. */
307 if (pattern
[0] && pattern
[strlen (pattern
) - 1] == '/')
308 flags
|= GLOB_ONLYDIR
;
310 if (!(flags
& GLOB_DOOFFS
))
311 /* Have to do this so `globfree' knows where to start freeing. It
312 also makes all the code that uses gl_offs simpler. */
315 if (!(flags
& GLOB_APPEND
))
318 if (!(flags
& GLOB_DOOFFS
))
319 pglob
->gl_pathv
= NULL
;
324 if (pglob
->gl_offs
>= ~((size_t) 0) / sizeof (char *))
327 pglob
->gl_pathv
= (char **) malloc ((pglob
->gl_offs
+ 1)
329 if (pglob
->gl_pathv
== NULL
)
332 for (i
= 0; i
<= pglob
->gl_offs
; ++i
)
333 pglob
->gl_pathv
[i
] = NULL
;
337 if (flags
& GLOB_BRACE
)
341 if (flags
& GLOB_NOESCAPE
)
342 begin
= strchr (pattern
, '{');
354 if (*begin
== '\\' && begin
[1] != '\0')
356 else if (*begin
== '{')
365 /* Allocate working buffer large enough for our work. Note that
366 we have at least an opening and closing brace. */
374 size_t pattern_len
= strlen (pattern
) - 1;
376 int alloca_onealt
= __libc_use_alloca (alloca_used
+ pattern_len
);
378 onealt
= alloca_account (pattern_len
, alloca_used
);
382 onealt
= (char *) malloc (pattern_len
);
387 /* We know the prefix for all sub-patterns. */
388 alt_start
= mempcpy (onealt
, pattern
, begin
- pattern
);
390 /* Find the first sub-pattern and at the same time find the
391 rest after the closing brace. */
392 next
= next_brace_sub (begin
+ 1, flags
);
395 /* It is an illegal expression. */
398 if (__glibc_unlikely (!alloca_onealt
))
401 flags
&= ~GLOB_BRACE
;
405 /* Now find the end of the whole brace expression. */
409 rest
= next_brace_sub (rest
+ 1, flags
);
411 /* It is an illegal expression. */
414 /* Please note that we now can be sure the brace expression
416 rest_len
= strlen (++rest
) + 1;
418 /* We have a brace expression. BEGIN points to the opening {,
419 NEXT points past the terminator of the first element, and END
420 points past the final }. We will accumulate result names from
421 recursive runs for each brace alternative in the buffer using
423 firstc
= pglob
->gl_pathc
;
430 /* Construct the new glob expression. */
431 mempcpy (mempcpy (alt_start
, p
, next
- p
), rest
, rest_len
);
433 result
= glob (onealt
,
434 ((flags
& ~(GLOB_NOCHECK
| GLOB_NOMAGIC
))
435 | GLOB_APPEND
), errfunc
, pglob
);
437 /* If we got an error, return it. */
438 if (result
&& result
!= GLOB_NOMATCH
)
441 if (__glibc_unlikely (!alloca_onealt
))
444 if (!(flags
& GLOB_APPEND
))
453 /* We saw the last entry. */
457 next
= next_brace_sub (p
, flags
);
458 assert (next
!= NULL
);
462 if (__glibc_unlikely (!alloca_onealt
))
466 if (pglob
->gl_pathc
!= firstc
)
467 /* We found some entries. */
469 else if (!(flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
475 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
477 /* Find the filename. */
478 filename
= strrchr (pattern
, '/');
479 #if defined __MSDOS__ || defined WINDOWS32
480 /* The case of "d:pattern". Since `:' is not allowed in
481 file names, we can safely assume that wherever it
482 happens in pattern, it signals the filename part. This
483 is so we could some day support patterns like "[a-z]:foo". */
484 if (filename
== NULL
)
485 filename
= strchr (pattern
, ':');
486 #endif /* __MSDOS__ || WINDOWS32 */
487 dirname_modified
= 0;
488 if (filename
== NULL
)
490 /* This can mean two things: a simple name or "~name". The latter
491 case is nothing but a notation for a directory. */
492 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && pattern
[0] == '~')
494 dirname
= (char *) pattern
;
495 dirlen
= strlen (pattern
);
497 /* Set FILENAME to NULL as a special flag. This is ugly but
498 other solutions would require much more code. We test for
499 this special case below. */
504 if (__glibc_unlikely (pattern
[0] == '\0'))
506 dirs
.gl_pathv
= NULL
;
512 dirname
= (char *) "";
514 dirname
= (char *) ".";
519 else if (filename
== pattern
520 || (filename
== pattern
+ 1 && pattern
[0] == '\\'
521 && (flags
& GLOB_NOESCAPE
) == 0))
523 /* "/pattern" or "\\/pattern". */
524 dirname
= (char *) "/";
531 dirlen
= filename
- pattern
;
532 #if defined __MSDOS__ || defined WINDOWS32
534 || (filename
> pattern
+ 1 && filename
[-1] == ':'))
539 drive_spec
= (char *) __alloca (dirlen
+ 1);
540 *((char *) mempcpy (drive_spec
, pattern
, dirlen
)) = '\0';
541 /* For now, disallow wildcards in the drive spec, to
542 prevent infinite recursion in glob. */
543 if (__glob_pattern_p (drive_spec
, !(flags
& GLOB_NOESCAPE
)))
545 /* If this is "d:pattern", we need to copy `:' to DIRNAME
546 as well. If it's "d:/pattern", don't remove the slash
547 from "d:/", since "d:" and "d:/" are not the same.*/
551 if (__libc_use_alloca (alloca_used
+ dirlen
+ 1))
552 newp
= alloca_account (dirlen
+ 1, alloca_used
);
556 newp
= malloc (dirlen
+ 1);
561 *((char *) mempcpy (newp
, pattern
, dirlen
)) = '\0';
565 if (filename
[0] == '\0'
566 #if defined __MSDOS__ || defined WINDOWS32
567 && dirname
[dirlen
- 1] != ':'
568 && (dirlen
< 3 || dirname
[dirlen
- 2] != ':'
569 || dirname
[dirlen
- 1] != '/')
572 /* "pattern/". Expand "pattern", appending slashes. */
574 int orig_flags
= flags
;
575 if (!(flags
& GLOB_NOESCAPE
) && dirname
[dirlen
- 1] == '\\')
577 /* "pattern\\/". Remove the final backslash if it hasn't
579 char *p
= (char *) &dirname
[dirlen
- 1];
581 while (p
> dirname
&& p
[-1] == '\\') --p
;
582 if ((&dirname
[dirlen
] - p
) & 1)
584 *(char *) &dirname
[--dirlen
] = '\0';
585 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
588 int val
= glob (dirname
, flags
| GLOB_MARK
, errfunc
, pglob
);
590 pglob
->gl_flags
= ((pglob
->gl_flags
& ~GLOB_MARK
)
591 | (flags
& GLOB_MARK
));
592 else if (val
== GLOB_NOMATCH
&& flags
!= orig_flags
)
594 /* Make sure globfree (&dirs); is a nop. */
595 dirs
.gl_pathv
= NULL
;
597 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
606 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && dirname
[0] == '~')
608 if (dirname
[1] == '\0' || dirname
[1] == '/'
609 || (!(flags
& GLOB_NOESCAPE
) && dirname
[1] == '\\'
610 && (dirname
[2] == '\0' || dirname
[2] == '/')))
612 /* Look up home directory. */
613 char *home_dir
= getenv ("HOME");
614 int malloc_home_dir
= 0;
616 if (home_dir
== NULL
|| home_dir
[0] == '\0')
620 if (home_dir
== NULL
|| home_dir
[0] == '\0')
621 home_dir
= "c:/users/default"; /* poor default */
623 if (home_dir
== NULL
|| home_dir
[0] == '\0')
627 size_t buflen
= GET_LOGIN_NAME_MAX () + 1;
630 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
633 name
= alloca_account (buflen
, alloca_used
);
635 success
= __getlogin_r (name
, buflen
) == 0;
639 # if defined HAVE_GETPWNAM_R || defined _LIBC
640 long int pwbuflen
= GETPW_R_SIZE_MAX ();
643 int malloc_pwtmpbuf
= 0;
648 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
649 Try a moderate value. */
652 if (__libc_use_alloca (alloca_used
+ pwbuflen
))
653 pwtmpbuf
= alloca_account (pwbuflen
, alloca_used
);
656 pwtmpbuf
= malloc (pwbuflen
);
657 if (pwtmpbuf
== NULL
)
659 retval
= GLOB_NOSPACE
;
665 while (getpwnam_r (name
, &pwbuf
, pwtmpbuf
, pwbuflen
, &p
)
675 && __libc_use_alloca (alloca_used
677 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, pwbuflen
,
682 char *newp
= realloc (malloc_pwtmpbuf
687 if (__glibc_unlikely (malloc_pwtmpbuf
))
689 retval
= GLOB_NOSPACE
;
693 pwbuflen
= 2 * pwbuflen
;
703 if (!malloc_pwtmpbuf
)
704 home_dir
= p
->pw_dir
;
707 size_t home_dir_len
= strlen (p
->pw_dir
) + 1;
708 if (__libc_use_alloca (alloca_used
+ home_dir_len
))
709 home_dir
= alloca_account (home_dir_len
,
713 home_dir
= malloc (home_dir_len
);
714 if (home_dir
== NULL
)
717 retval
= GLOB_NOSPACE
;
722 memcpy (home_dir
, p
->pw_dir
, home_dir_len
);
729 if (home_dir
== NULL
|| home_dir
[0] == '\0')
731 if (flags
& GLOB_TILDE_CHECK
)
733 if (__glibc_unlikely (malloc_home_dir
))
735 retval
= GLOB_NOMATCH
;
739 home_dir
= (char *) "~"; /* No luck. */
741 # endif /* WINDOWS32 */
743 /* Now construct the full directory. */
744 if (dirname
[1] == '\0')
746 if (__glibc_unlikely (malloc_dirname
))
750 dirlen
= strlen (dirname
);
751 malloc_dirname
= malloc_home_dir
;
756 size_t home_len
= strlen (home_dir
);
757 int use_alloca
= __libc_use_alloca (alloca_used
758 + home_len
+ dirlen
);
760 newp
= alloca_account (home_len
+ dirlen
, alloca_used
);
763 newp
= malloc (home_len
+ dirlen
);
766 if (__glibc_unlikely (malloc_home_dir
))
768 retval
= GLOB_NOSPACE
;
773 mempcpy (mempcpy (newp
, home_dir
, home_len
),
774 &dirname
[1], dirlen
);
776 if (__glibc_unlikely (malloc_dirname
))
780 dirlen
+= home_len
- 1;
781 malloc_dirname
= !use_alloca
;
783 dirname_modified
= 1;
785 # if !defined _AMIGA && !defined WINDOWS32
788 char *end_name
= strchr (dirname
, '/');
790 int malloc_user_name
= 0;
791 char *unescape
= NULL
;
793 if (!(flags
& GLOB_NOESCAPE
))
795 if (end_name
== NULL
)
797 unescape
= strchr (dirname
, '\\');
799 end_name
= strchr (unescape
, '\0');
802 unescape
= memchr (dirname
, '\\', end_name
- dirname
);
804 if (end_name
== NULL
)
805 user_name
= dirname
+ 1;
809 if (__libc_use_alloca (alloca_used
+ (end_name
- dirname
)))
810 newp
= alloca_account (end_name
- dirname
, alloca_used
);
813 newp
= malloc (end_name
- dirname
);
816 retval
= GLOB_NOSPACE
;
819 malloc_user_name
= 1;
821 if (unescape
!= NULL
)
823 char *p
= mempcpy (newp
, dirname
+ 1,
824 unescape
- dirname
- 1);
832 /* "~fo\\o\\" unescape to user_name "foo\\",
833 but "~fo\\o\\/" unescape to user_name
835 if (filename
== NULL
)
846 *((char *) mempcpy (newp
, dirname
+ 1, end_name
- dirname
))
851 /* Look up specific user's home directory. */
854 # if defined HAVE_GETPWNAM_R || defined _LIBC
855 long int buflen
= GETPW_R_SIZE_MAX ();
857 int malloc_pwtmpbuf
= 0;
863 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
867 if (__libc_use_alloca (alloca_used
+ buflen
))
868 pwtmpbuf
= alloca_account (buflen
, alloca_used
);
871 pwtmpbuf
= malloc (buflen
);
872 if (pwtmpbuf
== NULL
)
875 if (__glibc_unlikely (malloc_user_name
))
877 retval
= GLOB_NOSPACE
;
883 while (getpwnam_r (user_name
, &pwbuf
, pwtmpbuf
, buflen
, &p
) != 0)
891 && __libc_use_alloca (alloca_used
+ 2 * buflen
))
892 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, buflen
,
893 2 * buflen
, alloca_used
);
896 char *newp
= realloc (malloc_pwtmpbuf
? pwtmpbuf
: NULL
,
900 if (__glibc_unlikely (malloc_pwtmpbuf
))
910 p
= getpwnam (user_name
);
913 if (__glibc_unlikely (malloc_user_name
))
916 /* If we found a home directory use this. */
919 size_t home_len
= strlen (p
->pw_dir
);
920 size_t rest_len
= end_name
== NULL
? 0 : strlen (end_name
);
922 if (__glibc_unlikely (malloc_dirname
))
926 if (__libc_use_alloca (alloca_used
+ home_len
+ rest_len
+ 1))
927 dirname
= alloca_account (home_len
+ rest_len
+ 1,
931 dirname
= malloc (home_len
+ rest_len
+ 1);
934 if (__glibc_unlikely (malloc_pwtmpbuf
))
936 retval
= GLOB_NOSPACE
;
941 *((char *) mempcpy (mempcpy (dirname
, p
->pw_dir
, home_len
),
942 end_name
, rest_len
)) = '\0';
944 dirlen
= home_len
+ rest_len
;
945 dirname_modified
= 1;
947 if (__glibc_unlikely (malloc_pwtmpbuf
))
952 if (__glibc_unlikely (malloc_pwtmpbuf
))
955 if (flags
& GLOB_TILDE_CHECK
)
956 /* We have to regard it as an error if we cannot find the
962 # endif /* Not Amiga && not WINDOWS32. */
964 #endif /* Not VMS. */
966 /* Now test whether we looked for "~" or "~NAME". In this case we
967 can give the answer now. */
968 if (filename
== NULL
)
973 /* Return the directory if we don't check for error or if it exists. */
974 if ((flags
& GLOB_NOCHECK
)
975 || (((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
976 ? ((*pglob
->gl_stat
) (dirname
, &st
) == 0
977 && S_ISDIR (st
.st_mode
))
978 : (__stat64 (dirname
, &st64
) == 0 && S_ISDIR (st64
.st_mode
)))))
980 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
983 if (newcount
> UINTPTR_MAX
- (1 + 1)
984 || newcount
+ 1 + 1 > ~((size_t) 0) / sizeof (char *))
987 free (pglob
->gl_pathv
);
988 pglob
->gl_pathv
= NULL
;
994 = (char **) realloc (pglob
->gl_pathv
,
995 (newcount
+ 1 + 1) * sizeof (char *));
996 if (new_gl_pathv
== NULL
)
998 pglob
->gl_pathv
= new_gl_pathv
;
1000 if (flags
& GLOB_MARK
)
1003 pglob
->gl_pathv
[newcount
] = malloc (dirlen
+ 2);
1004 if (pglob
->gl_pathv
[newcount
] == NULL
)
1006 p
= mempcpy (pglob
->gl_pathv
[newcount
], dirname
, dirlen
);
1012 pglob
->gl_pathv
[newcount
] = strdup (dirname
);
1013 if (pglob
->gl_pathv
[newcount
] == NULL
)
1016 pglob
->gl_pathv
[++newcount
] = NULL
;
1018 pglob
->gl_flags
= flags
;
1024 return GLOB_NOMATCH
;
1027 meta
= __glob_pattern_type (dirname
, !(flags
& GLOB_NOESCAPE
));
1028 /* meta is 1 if correct glob pattern containing metacharacters.
1029 If meta has bit (1 << 2) set, it means there was an unterminated
1030 [ which we handle the same, using fnmatch. Broken unterminated
1031 pattern bracket expressions ought to be rare enough that it is
1032 not worth special casing them, fnmatch will do the right thing. */
1035 /* The directory name contains metacharacters, so we
1036 have to glob for the directory, and then glob for
1037 the pattern in each directory found. */
1040 if (!(flags
& GLOB_NOESCAPE
) && dirlen
> 0 && dirname
[dirlen
- 1] == '\\')
1042 /* "foo\\/bar". Remove the final backslash from dirname
1043 if it has not been quoted. */
1044 char *p
= (char *) &dirname
[dirlen
- 1];
1046 while (p
> dirname
&& p
[-1] == '\\') --p
;
1047 if ((&dirname
[dirlen
] - p
) & 1)
1048 *(char *) &dirname
[--dirlen
] = '\0';
1051 if (__glibc_unlikely ((flags
& GLOB_ALTDIRFUNC
) != 0))
1053 /* Use the alternative access functions also in the recursive
1055 dirs
.gl_opendir
= pglob
->gl_opendir
;
1056 dirs
.gl_readdir
= pglob
->gl_readdir
;
1057 dirs
.gl_closedir
= pglob
->gl_closedir
;
1058 dirs
.gl_stat
= pglob
->gl_stat
;
1059 dirs
.gl_lstat
= pglob
->gl_lstat
;
1062 status
= glob (dirname
,
1063 ((flags
& (GLOB_ERR
| GLOB_NOESCAPE
1065 | GLOB_NOSORT
| GLOB_ONLYDIR
),
1069 if ((flags
& GLOB_NOCHECK
) == 0 || status
!= GLOB_NOMATCH
)
1074 /* We have successfully globbed the preceding directory name.
1075 For each name we found, call glob_in_dir on it and FILENAME,
1076 appending the results to PGLOB. */
1077 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
1083 /* Make globbing interruptible in the bash shell. */
1084 extern int interrupt_state
;
1086 if (interrupt_state
)
1089 return GLOB_ABORTED
;
1094 old_pathc
= pglob
->gl_pathc
;
1095 status
= glob_in_dir (filename
, dirs
.gl_pathv
[i
],
1096 ((flags
| GLOB_APPEND
)
1097 & ~(GLOB_NOCHECK
| GLOB_NOMAGIC
)),
1098 errfunc
, pglob
, alloca_used
);
1099 if (status
== GLOB_NOMATCH
)
1100 /* No matches in this directory. Try the next. */
1107 pglob
->gl_pathc
= 0;
1111 /* Stick the directory on the front of each name. */
1112 if (prefix_array (dirs
.gl_pathv
[i
],
1113 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1114 pglob
->gl_pathc
- old_pathc
))
1118 pglob
->gl_pathc
= 0;
1119 return GLOB_NOSPACE
;
1123 flags
|= GLOB_MAGCHAR
;
1125 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
1126 But if we have not found any matching entry and the GLOB_NOCHECK
1127 flag was set we must return the input pattern itself. */
1128 if (pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1132 if (flags
& GLOB_NOCHECK
)
1134 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
1135 char **new_gl_pathv
;
1137 if (newcount
> UINTPTR_MAX
- 2
1138 || newcount
+ 2 > ~((size_t) 0) / sizeof (char *))
1142 return GLOB_NOSPACE
;
1145 new_gl_pathv
= (char **) realloc (pglob
->gl_pathv
,
1148 if (new_gl_pathv
== NULL
)
1150 pglob
->gl_pathv
= new_gl_pathv
;
1152 pglob
->gl_pathv
[newcount
] = __strdup (pattern
);
1153 if (pglob
->gl_pathv
[newcount
] == NULL
)
1157 pglob
->gl_pathc
= 0;
1158 return GLOB_NOSPACE
;
1164 pglob
->gl_pathv
[newcount
] = NULL
;
1165 pglob
->gl_flags
= flags
;
1170 return GLOB_NOMATCH
;
1178 size_t old_pathc
= pglob
->gl_pathc
;
1179 int orig_flags
= flags
;
1183 char *p
= strchr (dirname
, '\\'), *q
;
1184 /* We need to unescape the dirname string. It is certainly
1185 allocated by alloca, as otherwise filename would be NULL
1186 or dirname wouldn't contain backslashes. */
1199 while (*p
++ != '\0');
1200 dirname_modified
= 1;
1202 if (dirname_modified
)
1203 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
1204 status
= glob_in_dir (filename
, dirname
, flags
, errfunc
, pglob
,
1208 if (status
== GLOB_NOMATCH
&& flags
!= orig_flags
1209 && pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1211 /* Make sure globfree (&dirs); is a nop. */
1212 dirs
.gl_pathv
= NULL
;
1221 /* Stick the directory on the front of each name. */
1222 if (prefix_array (dirname
,
1223 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1224 pglob
->gl_pathc
- old_pathc
))
1227 pglob
->gl_pathc
= 0;
1228 return GLOB_NOSPACE
;
1233 if (flags
& GLOB_MARK
)
1235 /* Append slashes to directory names. */
1240 for (i
= oldcount
; i
< pglob
->gl_pathc
+ pglob
->gl_offs
; ++i
)
1241 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1242 ? ((*pglob
->gl_stat
) (pglob
->gl_pathv
[i
], &st
) == 0
1243 && S_ISDIR (st
.st_mode
))
1244 : (__stat64 (pglob
->gl_pathv
[i
], &st64
) == 0
1245 && S_ISDIR (st64
.st_mode
))))
1247 size_t len
= strlen (pglob
->gl_pathv
[i
]) + 2;
1248 char *new = realloc (pglob
->gl_pathv
[i
], len
);
1252 pglob
->gl_pathc
= 0;
1253 return GLOB_NOSPACE
;
1255 strcpy (&new[len
- 2], "/");
1256 pglob
->gl_pathv
[i
] = new;
1260 if (!(flags
& GLOB_NOSORT
))
1262 /* Sort the vector. */
1263 qsort (&pglob
->gl_pathv
[oldcount
],
1264 pglob
->gl_pathc
+ pglob
->gl_offs
- oldcount
,
1265 sizeof (char *), collated_compare
);
1269 if (__glibc_unlikely (malloc_dirname
))
1274 #if defined _LIBC && !defined glob
1275 libc_hidden_def (glob
)
1279 #if !defined _LIBC || !defined GLOB_ONLY_P
1281 /* Free storage allocated in PGLOB by a previous `glob' call. */
1283 globfree (glob_t
*pglob
)
1285 if (pglob
->gl_pathv
!= NULL
)
1288 for (i
= 0; i
< pglob
->gl_pathc
; ++i
)
1289 free (pglob
->gl_pathv
[pglob
->gl_offs
+ i
]);
1290 free (pglob
->gl_pathv
);
1291 pglob
->gl_pathv
= NULL
;
1294 #if defined _LIBC && !defined globfree
1295 libc_hidden_def (globfree
)
1299 /* Do a collated comparison of A and B. */
1301 collated_compare (const void *a
, const void *b
)
1303 const char *const s1
= *(const char *const * const) a
;
1304 const char *const s2
= *(const char *const * const) b
;
1312 return strcoll (s1
, s2
);
1316 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1317 elements in place. Return nonzero if out of memory, zero if successful.
1318 A slash is inserted between DIRNAME and each elt of ARRAY,
1319 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1321 prefix_array (const char *dirname
, char **array
, size_t n
)
1324 size_t dirlen
= strlen (dirname
);
1325 #if defined __MSDOS__ || defined WINDOWS32
1327 # define DIRSEP_CHAR sep_char
1329 # define DIRSEP_CHAR '/'
1332 if (dirlen
== 1 && dirname
[0] == '/')
1333 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1334 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1336 #if defined __MSDOS__ || defined WINDOWS32
1337 else if (dirlen
> 1)
1339 if (dirname
[dirlen
- 1] == '/' && dirname
[dirlen
- 2] == ':')
1340 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1342 else if (dirname
[dirlen
- 1] == ':')
1344 /* DIRNAME is "d:". Use `:' instead of `/'. */
1351 for (i
= 0; i
< n
; ++i
)
1353 size_t eltlen
= strlen (array
[i
]) + 1;
1354 char *new = (char *) malloc (dirlen
+ 1 + eltlen
);
1363 char *endp
= mempcpy (new, dirname
, dirlen
);
1364 *endp
++ = DIRSEP_CHAR
;
1365 mempcpy (endp
, array
[i
], eltlen
);
1375 /* We must not compile this function twice. */
1376 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1378 __glob_pattern_type (const char *pattern
, int quote
)
1383 for (p
= pattern
; *p
!= '\0'; ++p
)
1412 /* Return nonzero if PATTERN contains any metacharacters.
1413 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1415 __glob_pattern_p (const char *pattern
, int quote
)
1417 return __glob_pattern_type (pattern
, quote
) == 1;
1420 weak_alias (__glob_pattern_p
, glob_pattern_p
)
1424 #endif /* !GLOB_ONLY_P */
1427 /* We put this in a separate function mainly to allow the memory
1428 allocated with alloca to be recycled. */
1429 #if !defined _LIBC || !defined GLOB_ONLY_P
1431 __attribute_noinline__
1432 link_exists2_p (const char *dir
, size_t dirlen
, const char *fname
,
1439 size_t fnamelen
= strlen (fname
);
1440 char *fullname
= (char *) __alloca (dirlen
+ 1 + fnamelen
+ 1);
1446 mempcpy (mempcpy (mempcpy (fullname
, dir
, dirlen
), "/", 1),
1447 fname
, fnamelen
+ 1);
1450 return (*pglob
->gl_stat
) (fullname
, &st
) == 0;
1452 return ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1453 ? (*pglob
->gl_stat
) (fullname
, &st
)
1454 : __stat64 (fullname
, &st64
)) == 0);
1458 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1459 (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) \
1460 ? link_exists2_p (dirname, dirnamelen, fname, pglob) \
1461 : ({ struct stat64 st64; \
1462 __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0; }))
1464 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1465 link_exists2_p (dirname, dirnamelen, fname, pglob, flags)
1470 /* Like `glob', but PATTERN is a final pathname component,
1471 and matches are searched for in DIRECTORY.
1472 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1473 The GLOB_APPEND flag is assumed to be set (always appends). */
1475 glob_in_dir (const char *pattern
, const char *directory
, int flags
,
1476 int (*errfunc
) (const char *, int),
1477 glob_t
*pglob
, size_t alloca_used
)
1479 size_t dirlen
= strlen (directory
);
1480 void *stream
= NULL
;
1483 struct globnames
*next
;
1487 #define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
1488 struct globnames init_names
;
1489 struct globnames
*names
= &init_names
;
1490 struct globnames
*names_alloca
= &init_names
;
1496 alloca_used
+= sizeof (init_names
);
1498 init_names
.next
= NULL
;
1499 init_names
.count
= INITIAL_COUNT
;
1501 meta
= __glob_pattern_type (pattern
, !(flags
& GLOB_NOESCAPE
));
1502 if (meta
== 0 && (flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
1504 /* We need not do any tests. The PATTERN contains no meta
1505 characters and we must not return an error therefore the
1506 result will always contain exactly one name. */
1507 flags
|= GLOB_NOCHECK
;
1511 /* Since we use the normal file functions we can also use stat()
1512 to verify the file is there. */
1518 size_t patlen
= strlen (pattern
);
1519 int alloca_fullname
= __libc_use_alloca (alloca_used
1520 + dirlen
+ 1 + patlen
+ 1);
1522 if (alloca_fullname
)
1523 fullname
= alloca_account (dirlen
+ 1 + patlen
+ 1, alloca_used
);
1526 fullname
= malloc (dirlen
+ 1 + patlen
+ 1);
1527 if (fullname
== NULL
)
1528 return GLOB_NOSPACE
;
1531 mempcpy (mempcpy (mempcpy (fullname
, directory
, dirlen
),
1533 pattern
, patlen
+ 1);
1534 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1535 ? (*pglob
->gl_stat
) (fullname
, &ust
.st
)
1536 : __stat64 (fullname
, &ust
.st64
)) == 0)
1537 /* We found this file to be existing. Now tell the rest
1538 of the function to copy this name into the result. */
1539 flags
|= GLOB_NOCHECK
;
1541 if (__glibc_unlikely (!alloca_fullname
))
1546 stream
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1547 ? (*pglob
->gl_opendir
) (directory
)
1548 : opendir (directory
));
1551 if (errno
!= ENOTDIR
1552 && ((errfunc
!= NULL
&& (*errfunc
) (directory
, errno
))
1553 || (flags
& GLOB_ERR
)))
1554 return GLOB_ABORTED
;
1559 int dfd
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1560 ? -1 : dirfd ((DIR *) stream
));
1562 int fnm_flags
= ((!(flags
& GLOB_PERIOD
) ? FNM_PERIOD
: 0)
1563 | ((flags
& GLOB_NOESCAPE
) ? FNM_NOESCAPE
: 0)
1564 #if defined _AMIGA || defined VMS
1568 flags
|= GLOB_MAGCHAR
;
1572 struct readdir_result d
;
1574 if (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
1575 d
= convert_dirent (GL_READDIR (pglob
, stream
));
1578 #ifdef COMPILE_GLOB64
1579 d
= convert_dirent (__readdir (stream
));
1581 d
= convert_dirent64 (__readdir64 (stream
));
1590 /* If we shall match only directories use the information
1591 provided by the dirent call if possible. */
1592 if ((flags
& GLOB_ONLYDIR
) && !readdir_result_might_be_dir (d
))
1595 if (fnmatch (pattern
, d
.name
, fnm_flags
) == 0)
1597 /* If the file we found is a symlink we have to
1598 make sure the target file exists. */
1599 if (!readdir_result_might_be_symlink (d
)
1600 || link_exists_p (dfd
, directory
, dirlen
, d
.name
,
1603 if (cur
== names
->count
)
1605 struct globnames
*newnames
;
1606 size_t count
= names
->count
* 2;
1607 size_t size
= (sizeof (struct globnames
)
1608 + ((count
- INITIAL_COUNT
)
1609 * sizeof (char *)));
1610 if (__libc_use_alloca (alloca_used
+ size
))
1611 newnames
= names_alloca
1612 = alloca_account (size
, alloca_used
);
1613 else if ((newnames
= malloc (size
))
1616 newnames
->count
= count
;
1617 newnames
->next
= names
;
1621 names
->name
[cur
] = strdup (d
.name
);
1622 if (names
->name
[cur
] == NULL
)
1632 if (nfound
== 0 && (flags
& GLOB_NOCHECK
))
1634 size_t len
= strlen (pattern
);
1636 names
->name
[cur
] = (char *) malloc (len
+ 1);
1637 if (names
->name
[cur
] == NULL
)
1639 *((char *) mempcpy (names
->name
[cur
++], pattern
, len
)) = '\0';
1642 int result
= GLOB_NOMATCH
;
1647 if (pglob
->gl_pathc
> UINTPTR_MAX
- pglob
->gl_offs
1648 || pglob
->gl_pathc
+ pglob
->gl_offs
> UINTPTR_MAX
- nfound
1649 || pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
> UINTPTR_MAX
- 1
1650 || (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1
1651 > UINTPTR_MAX
/ sizeof (char *)))
1654 char **new_gl_pathv
;
1656 = (char **) realloc (pglob
->gl_pathv
,
1657 (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1)
1659 if (new_gl_pathv
== NULL
)
1664 struct globnames
*old
= names
;
1665 for (size_t i
= 0; i
< cur
; ++i
)
1666 free (names
->name
[i
]);
1667 names
= names
->next
;
1668 /* NB: we will not leak memory here if we exit without
1669 freeing the current block assigned to OLD. At least
1670 the very first block is always allocated on the stack
1671 and this is the block assigned to OLD here. */
1674 assert (old
== &init_names
);
1678 if (old
== names_alloca
)
1679 names_alloca
= names
;
1683 result
= GLOB_NOSPACE
;
1689 struct globnames
*old
= names
;
1690 for (size_t i
= 0; i
< cur
; ++i
)
1691 new_gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
++]
1693 names
= names
->next
;
1694 /* NB: we will not leak memory here if we exit without
1695 freeing the current block assigned to OLD. At least
1696 the very first block is always allocated on the stack
1697 and this is the block assigned to OLD here. */
1700 assert (old
== &init_names
);
1704 if (old
== names_alloca
)
1705 names_alloca
= names
;
1710 pglob
->gl_pathv
= new_gl_pathv
;
1712 pglob
->gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
] = NULL
;
1714 pglob
->gl_flags
= flags
;
1721 if (__glibc_unlikely (flags
& GLOB_ALTDIRFUNC
))
1722 (*pglob
->gl_closedir
) (stream
);