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_BRACE
)
319 if (flags
& GLOB_NOESCAPE
)
320 begin
= strchr (pattern
, '{');
332 if (*begin
== '\\' && begin
[1] != '\0')
334 else if (*begin
== '{')
343 /* Allocate working buffer large enough for our work. Note that
344 we have at least an opening and closing brace. */
352 size_t pattern_len
= strlen (pattern
) - 1;
354 int alloca_onealt
= __libc_use_alloca (alloca_used
+ pattern_len
);
356 onealt
= alloca_account (pattern_len
, alloca_used
);
360 onealt
= (char *) malloc (pattern_len
);
363 if (!(flags
& GLOB_APPEND
))
366 pglob
->gl_pathv
= NULL
;
372 /* We know the prefix for all sub-patterns. */
373 alt_start
= mempcpy (onealt
, pattern
, begin
- pattern
);
375 /* Find the first sub-pattern and at the same time find the
376 rest after the closing brace. */
377 next
= next_brace_sub (begin
+ 1, flags
);
380 /* It is an illegal expression. */
383 if (__glibc_unlikely (!alloca_onealt
))
386 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
389 /* Now find the end of the whole brace expression. */
393 rest
= next_brace_sub (rest
+ 1, flags
);
395 /* It is an illegal expression. */
398 /* Please note that we now can be sure the brace expression
400 rest_len
= strlen (++rest
) + 1;
402 /* We have a brace expression. BEGIN points to the opening {,
403 NEXT points past the terminator of the first element, and END
404 points past the final }. We will accumulate result names from
405 recursive runs for each brace alternative in the buffer using
408 if (!(flags
& GLOB_APPEND
))
410 /* This call is to set a new vector, so clear out the
411 vector so we can append to it. */
413 pglob
->gl_pathv
= NULL
;
415 firstc
= pglob
->gl_pathc
;
422 /* Construct the new glob expression. */
423 mempcpy (mempcpy (alt_start
, p
, next
- p
), rest
, rest_len
);
425 result
= glob (onealt
,
426 ((flags
& ~(GLOB_NOCHECK
| GLOB_NOMAGIC
))
427 | GLOB_APPEND
), errfunc
, pglob
);
429 /* If we got an error, return it. */
430 if (result
&& result
!= GLOB_NOMATCH
)
433 if (__glibc_unlikely (!alloca_onealt
))
436 if (!(flags
& GLOB_APPEND
))
445 /* We saw the last entry. */
449 next
= next_brace_sub (p
, flags
);
450 assert (next
!= NULL
);
454 if (__glibc_unlikely (!alloca_onealt
))
458 if (pglob
->gl_pathc
!= firstc
)
459 /* We found some entries. */
461 else if (!(flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
466 if (!(flags
& GLOB_APPEND
))
469 if (!(flags
& GLOB_DOOFFS
))
470 pglob
->gl_pathv
= NULL
;
475 if (pglob
->gl_offs
>= ~((size_t) 0) / sizeof (char *))
478 pglob
->gl_pathv
= (char **) malloc ((pglob
->gl_offs
+ 1)
480 if (pglob
->gl_pathv
== NULL
)
483 for (i
= 0; i
<= pglob
->gl_offs
; ++i
)
484 pglob
->gl_pathv
[i
] = NULL
;
488 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
490 /* Find the filename. */
491 filename
= strrchr (pattern
, '/');
492 #if defined __MSDOS__ || defined WINDOWS32
493 /* The case of "d:pattern". Since `:' is not allowed in
494 file names, we can safely assume that wherever it
495 happens in pattern, it signals the filename part. This
496 is so we could some day support patterns like "[a-z]:foo". */
497 if (filename
== NULL
)
498 filename
= strchr (pattern
, ':');
499 #endif /* __MSDOS__ || WINDOWS32 */
500 dirname_modified
= 0;
501 if (filename
== NULL
)
503 /* This can mean two things: a simple name or "~name". The latter
504 case is nothing but a notation for a directory. */
505 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && pattern
[0] == '~')
507 dirname
= (char *) pattern
;
508 dirlen
= strlen (pattern
);
510 /* Set FILENAME to NULL as a special flag. This is ugly but
511 other solutions would require much more code. We test for
512 this special case below. */
517 if (__glibc_unlikely (pattern
[0] == '\0'))
519 dirs
.gl_pathv
= NULL
;
525 dirname
= (char *) "";
527 dirname
= (char *) ".";
532 else if (filename
== pattern
533 || (filename
== pattern
+ 1 && pattern
[0] == '\\'
534 && (flags
& GLOB_NOESCAPE
) == 0))
536 /* "/pattern" or "\\/pattern". */
537 dirname
= (char *) "/";
544 dirlen
= filename
- pattern
;
545 #if defined __MSDOS__ || defined WINDOWS32
547 || (filename
> pattern
+ 1 && filename
[-1] == ':'))
552 drive_spec
= (char *) __alloca (dirlen
+ 1);
553 *((char *) mempcpy (drive_spec
, pattern
, dirlen
)) = '\0';
554 /* For now, disallow wildcards in the drive spec, to
555 prevent infinite recursion in glob. */
556 if (__glob_pattern_p (drive_spec
, !(flags
& GLOB_NOESCAPE
)))
558 /* If this is "d:pattern", we need to copy `:' to DIRNAME
559 as well. If it's "d:/pattern", don't remove the slash
560 from "d:/", since "d:" and "d:/" are not the same.*/
564 if (__libc_use_alloca (alloca_used
+ dirlen
+ 1))
565 newp
= alloca_account (dirlen
+ 1, alloca_used
);
569 newp
= malloc (dirlen
+ 1);
574 *((char *) mempcpy (newp
, pattern
, dirlen
)) = '\0';
578 if (filename
[0] == '\0'
579 #if defined __MSDOS__ || defined WINDOWS32
580 && dirname
[dirlen
- 1] != ':'
581 && (dirlen
< 3 || dirname
[dirlen
- 2] != ':'
582 || dirname
[dirlen
- 1] != '/')
585 /* "pattern/". Expand "pattern", appending slashes. */
587 int orig_flags
= flags
;
588 if (!(flags
& GLOB_NOESCAPE
) && dirname
[dirlen
- 1] == '\\')
590 /* "pattern\\/". Remove the final backslash if it hasn't
592 char *p
= (char *) &dirname
[dirlen
- 1];
594 while (p
> dirname
&& p
[-1] == '\\') --p
;
595 if ((&dirname
[dirlen
] - p
) & 1)
597 *(char *) &dirname
[--dirlen
] = '\0';
598 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
601 int val
= glob (dirname
, flags
| GLOB_MARK
, errfunc
, pglob
);
603 pglob
->gl_flags
= ((pglob
->gl_flags
& ~GLOB_MARK
)
604 | (flags
& GLOB_MARK
));
605 else if (val
== GLOB_NOMATCH
&& flags
!= orig_flags
)
607 /* Make sure globfree (&dirs); is a nop. */
608 dirs
.gl_pathv
= NULL
;
610 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
619 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && dirname
[0] == '~')
621 if (dirname
[1] == '\0' || dirname
[1] == '/'
622 || (!(flags
& GLOB_NOESCAPE
) && dirname
[1] == '\\'
623 && (dirname
[2] == '\0' || dirname
[2] == '/')))
625 /* Look up home directory. */
626 char *home_dir
= getenv ("HOME");
627 int malloc_home_dir
= 0;
629 if (home_dir
== NULL
|| home_dir
[0] == '\0')
633 if (home_dir
== NULL
|| home_dir
[0] == '\0')
634 home_dir
= "c:/users/default"; /* poor default */
636 if (home_dir
== NULL
|| home_dir
[0] == '\0')
640 size_t buflen
= GET_LOGIN_NAME_MAX () + 1;
643 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
646 name
= alloca_account (buflen
, alloca_used
);
648 success
= __getlogin_r (name
, buflen
) == 0;
652 # if defined HAVE_GETPWNAM_R || defined _LIBC
653 long int pwbuflen
= GETPW_R_SIZE_MAX ();
656 int malloc_pwtmpbuf
= 0;
661 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
662 Try a moderate value. */
665 if (__libc_use_alloca (alloca_used
+ pwbuflen
))
666 pwtmpbuf
= alloca_account (pwbuflen
, alloca_used
);
669 pwtmpbuf
= malloc (pwbuflen
);
670 if (pwtmpbuf
== NULL
)
672 retval
= GLOB_NOSPACE
;
678 while (getpwnam_r (name
, &pwbuf
, pwtmpbuf
, pwbuflen
, &p
)
688 && __libc_use_alloca (alloca_used
690 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, pwbuflen
,
695 char *newp
= realloc (malloc_pwtmpbuf
700 if (__glibc_unlikely (malloc_pwtmpbuf
))
702 retval
= GLOB_NOSPACE
;
706 pwbuflen
= 2 * pwbuflen
;
716 if (!malloc_pwtmpbuf
)
717 home_dir
= p
->pw_dir
;
720 size_t home_dir_len
= strlen (p
->pw_dir
) + 1;
721 if (__libc_use_alloca (alloca_used
+ home_dir_len
))
722 home_dir
= alloca_account (home_dir_len
,
726 home_dir
= malloc (home_dir_len
);
727 if (home_dir
== NULL
)
730 retval
= GLOB_NOSPACE
;
735 memcpy (home_dir
, p
->pw_dir
, home_dir_len
);
742 if (home_dir
== NULL
|| home_dir
[0] == '\0')
744 if (flags
& GLOB_TILDE_CHECK
)
746 if (__glibc_unlikely (malloc_home_dir
))
748 retval
= GLOB_NOMATCH
;
752 home_dir
= (char *) "~"; /* No luck. */
754 # endif /* WINDOWS32 */
756 /* Now construct the full directory. */
757 if (dirname
[1] == '\0')
759 if (__glibc_unlikely (malloc_dirname
))
763 dirlen
= strlen (dirname
);
764 malloc_dirname
= malloc_home_dir
;
769 size_t home_len
= strlen (home_dir
);
770 int use_alloca
= __libc_use_alloca (alloca_used
771 + home_len
+ dirlen
);
773 newp
= alloca_account (home_len
+ dirlen
, alloca_used
);
776 newp
= malloc (home_len
+ dirlen
);
779 if (__glibc_unlikely (malloc_home_dir
))
781 retval
= GLOB_NOSPACE
;
786 mempcpy (mempcpy (newp
, home_dir
, home_len
),
787 &dirname
[1], dirlen
);
789 if (__glibc_unlikely (malloc_dirname
))
793 dirlen
+= home_len
- 1;
794 malloc_dirname
= !use_alloca
;
796 dirname_modified
= 1;
798 # if !defined _AMIGA && !defined WINDOWS32
801 char *end_name
= strchr (dirname
, '/');
803 int malloc_user_name
= 0;
804 char *unescape
= NULL
;
806 if (!(flags
& GLOB_NOESCAPE
))
808 if (end_name
== NULL
)
810 unescape
= strchr (dirname
, '\\');
812 end_name
= strchr (unescape
, '\0');
815 unescape
= memchr (dirname
, '\\', end_name
- dirname
);
817 if (end_name
== NULL
)
818 user_name
= dirname
+ 1;
822 if (__libc_use_alloca (alloca_used
+ (end_name
- dirname
)))
823 newp
= alloca_account (end_name
- dirname
, alloca_used
);
826 newp
= malloc (end_name
- dirname
);
829 retval
= GLOB_NOSPACE
;
832 malloc_user_name
= 1;
834 if (unescape
!= NULL
)
836 char *p
= mempcpy (newp
, dirname
+ 1,
837 unescape
- dirname
- 1);
845 /* "~fo\\o\\" unescape to user_name "foo\\",
846 but "~fo\\o\\/" unescape to user_name
848 if (filename
== NULL
)
859 *((char *) mempcpy (newp
, dirname
+ 1, end_name
- dirname
))
864 /* Look up specific user's home directory. */
867 # if defined HAVE_GETPWNAM_R || defined _LIBC
868 long int buflen
= GETPW_R_SIZE_MAX ();
870 int malloc_pwtmpbuf
= 0;
876 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
880 if (__libc_use_alloca (alloca_used
+ buflen
))
881 pwtmpbuf
= alloca_account (buflen
, alloca_used
);
884 pwtmpbuf
= malloc (buflen
);
885 if (pwtmpbuf
== NULL
)
888 if (__glibc_unlikely (malloc_user_name
))
890 retval
= GLOB_NOSPACE
;
896 while (getpwnam_r (user_name
, &pwbuf
, pwtmpbuf
, buflen
, &p
) != 0)
904 && __libc_use_alloca (alloca_used
+ 2 * buflen
))
905 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, buflen
,
906 2 * buflen
, alloca_used
);
909 char *newp
= realloc (malloc_pwtmpbuf
? pwtmpbuf
: NULL
,
913 if (__glibc_unlikely (malloc_pwtmpbuf
))
923 p
= getpwnam (user_name
);
926 if (__glibc_unlikely (malloc_user_name
))
929 /* If we found a home directory use this. */
932 size_t home_len
= strlen (p
->pw_dir
);
933 size_t rest_len
= end_name
== NULL
? 0 : strlen (end_name
);
935 if (__glibc_unlikely (malloc_dirname
))
939 if (__libc_use_alloca (alloca_used
+ home_len
+ rest_len
+ 1))
940 dirname
= alloca_account (home_len
+ rest_len
+ 1,
944 dirname
= malloc (home_len
+ rest_len
+ 1);
947 if (__glibc_unlikely (malloc_pwtmpbuf
))
949 retval
= GLOB_NOSPACE
;
954 *((char *) mempcpy (mempcpy (dirname
, p
->pw_dir
, home_len
),
955 end_name
, rest_len
)) = '\0';
957 dirlen
= home_len
+ rest_len
;
958 dirname_modified
= 1;
960 if (__glibc_unlikely (malloc_pwtmpbuf
))
965 if (__glibc_unlikely (malloc_pwtmpbuf
))
968 if (flags
& GLOB_TILDE_CHECK
)
969 /* We have to regard it as an error if we cannot find the
975 # endif /* Not Amiga && not WINDOWS32. */
977 #endif /* Not VMS. */
979 /* Now test whether we looked for "~" or "~NAME". In this case we
980 can give the answer now. */
981 if (filename
== NULL
)
986 /* Return the directory if we don't check for error or if it exists. */
987 if ((flags
& GLOB_NOCHECK
)
988 || (((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
989 ? ((*pglob
->gl_stat
) (dirname
, &st
) == 0
990 && S_ISDIR (st
.st_mode
))
991 : (__stat64 (dirname
, &st64
) == 0 && S_ISDIR (st64
.st_mode
)))))
993 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
996 if (newcount
> UINTPTR_MAX
- (1 + 1)
997 || newcount
+ 1 + 1 > ~((size_t) 0) / sizeof (char *))
1000 free (pglob
->gl_pathv
);
1001 pglob
->gl_pathv
= NULL
;
1002 pglob
->gl_pathc
= 0;
1003 return GLOB_NOSPACE
;
1007 = (char **) realloc (pglob
->gl_pathv
,
1008 (newcount
+ 1 + 1) * sizeof (char *));
1009 if (new_gl_pathv
== NULL
)
1011 pglob
->gl_pathv
= new_gl_pathv
;
1013 if (flags
& GLOB_MARK
)
1016 pglob
->gl_pathv
[newcount
] = malloc (dirlen
+ 2);
1017 if (pglob
->gl_pathv
[newcount
] == NULL
)
1019 p
= mempcpy (pglob
->gl_pathv
[newcount
], dirname
, dirlen
);
1025 pglob
->gl_pathv
[newcount
] = strdup (dirname
);
1026 if (pglob
->gl_pathv
[newcount
] == NULL
)
1029 pglob
->gl_pathv
[++newcount
] = NULL
;
1031 pglob
->gl_flags
= flags
;
1037 return GLOB_NOMATCH
;
1040 meta
= __glob_pattern_type (dirname
, !(flags
& GLOB_NOESCAPE
));
1041 /* meta is 1 if correct glob pattern containing metacharacters.
1042 If meta has bit (1 << 2) set, it means there was an unterminated
1043 [ which we handle the same, using fnmatch. Broken unterminated
1044 pattern bracket expressions ought to be rare enough that it is
1045 not worth special casing them, fnmatch will do the right thing. */
1048 /* The directory name contains metacharacters, so we
1049 have to glob for the directory, and then glob for
1050 the pattern in each directory found. */
1053 if (!(flags
& GLOB_NOESCAPE
) && dirlen
> 0 && dirname
[dirlen
- 1] == '\\')
1055 /* "foo\\/bar". Remove the final backslash from dirname
1056 if it has not been quoted. */
1057 char *p
= (char *) &dirname
[dirlen
- 1];
1059 while (p
> dirname
&& p
[-1] == '\\') --p
;
1060 if ((&dirname
[dirlen
] - p
) & 1)
1061 *(char *) &dirname
[--dirlen
] = '\0';
1064 if (__glibc_unlikely ((flags
& GLOB_ALTDIRFUNC
) != 0))
1066 /* Use the alternative access functions also in the recursive
1068 dirs
.gl_opendir
= pglob
->gl_opendir
;
1069 dirs
.gl_readdir
= pglob
->gl_readdir
;
1070 dirs
.gl_closedir
= pglob
->gl_closedir
;
1071 dirs
.gl_stat
= pglob
->gl_stat
;
1072 dirs
.gl_lstat
= pglob
->gl_lstat
;
1075 status
= glob (dirname
,
1076 ((flags
& (GLOB_ERR
| GLOB_NOESCAPE
1078 | GLOB_NOSORT
| GLOB_ONLYDIR
),
1082 if ((flags
& GLOB_NOCHECK
) == 0 || status
!= GLOB_NOMATCH
)
1087 /* We have successfully globbed the preceding directory name.
1088 For each name we found, call glob_in_dir on it and FILENAME,
1089 appending the results to PGLOB. */
1090 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
1096 /* Make globbing interruptible in the bash shell. */
1097 extern int interrupt_state
;
1099 if (interrupt_state
)
1102 return GLOB_ABORTED
;
1107 old_pathc
= pglob
->gl_pathc
;
1108 status
= glob_in_dir (filename
, dirs
.gl_pathv
[i
],
1109 ((flags
| GLOB_APPEND
)
1110 & ~(GLOB_NOCHECK
| GLOB_NOMAGIC
)),
1111 errfunc
, pglob
, alloca_used
);
1112 if (status
== GLOB_NOMATCH
)
1113 /* No matches in this directory. Try the next. */
1120 pglob
->gl_pathc
= 0;
1124 /* Stick the directory on the front of each name. */
1125 if (prefix_array (dirs
.gl_pathv
[i
],
1126 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1127 pglob
->gl_pathc
- old_pathc
))
1131 pglob
->gl_pathc
= 0;
1132 return GLOB_NOSPACE
;
1136 flags
|= GLOB_MAGCHAR
;
1138 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
1139 But if we have not found any matching entry and the GLOB_NOCHECK
1140 flag was set we must return the input pattern itself. */
1141 if (pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1145 if (flags
& GLOB_NOCHECK
)
1147 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
1148 char **new_gl_pathv
;
1150 if (newcount
> UINTPTR_MAX
- 2
1151 || newcount
+ 2 > ~((size_t) 0) / sizeof (char *))
1155 return GLOB_NOSPACE
;
1158 new_gl_pathv
= (char **) realloc (pglob
->gl_pathv
,
1161 if (new_gl_pathv
== NULL
)
1163 pglob
->gl_pathv
= new_gl_pathv
;
1165 pglob
->gl_pathv
[newcount
] = __strdup (pattern
);
1166 if (pglob
->gl_pathv
[newcount
] == NULL
)
1170 pglob
->gl_pathc
= 0;
1171 return GLOB_NOSPACE
;
1177 pglob
->gl_pathv
[newcount
] = NULL
;
1178 pglob
->gl_flags
= flags
;
1183 return GLOB_NOMATCH
;
1191 size_t old_pathc
= pglob
->gl_pathc
;
1192 int orig_flags
= flags
;
1196 char *p
= strchr (dirname
, '\\'), *q
;
1197 /* We need to unescape the dirname string. It is certainly
1198 allocated by alloca, as otherwise filename would be NULL
1199 or dirname wouldn't contain backslashes. */
1212 while (*p
++ != '\0');
1213 dirname_modified
= 1;
1215 if (dirname_modified
)
1216 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
1217 status
= glob_in_dir (filename
, dirname
, flags
, errfunc
, pglob
,
1221 if (status
== GLOB_NOMATCH
&& flags
!= orig_flags
1222 && pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1224 /* Make sure globfree (&dirs); is a nop. */
1225 dirs
.gl_pathv
= NULL
;
1234 /* Stick the directory on the front of each name. */
1235 if (prefix_array (dirname
,
1236 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1237 pglob
->gl_pathc
- old_pathc
))
1240 pglob
->gl_pathc
= 0;
1241 return GLOB_NOSPACE
;
1246 if (flags
& GLOB_MARK
)
1248 /* Append slashes to directory names. */
1253 for (i
= oldcount
; i
< pglob
->gl_pathc
+ pglob
->gl_offs
; ++i
)
1254 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1255 ? ((*pglob
->gl_stat
) (pglob
->gl_pathv
[i
], &st
) == 0
1256 && S_ISDIR (st
.st_mode
))
1257 : (__stat64 (pglob
->gl_pathv
[i
], &st64
) == 0
1258 && S_ISDIR (st64
.st_mode
))))
1260 size_t len
= strlen (pglob
->gl_pathv
[i
]) + 2;
1261 char *new = realloc (pglob
->gl_pathv
[i
], len
);
1265 pglob
->gl_pathc
= 0;
1266 return GLOB_NOSPACE
;
1268 strcpy (&new[len
- 2], "/");
1269 pglob
->gl_pathv
[i
] = new;
1273 if (!(flags
& GLOB_NOSORT
))
1275 /* Sort the vector. */
1276 qsort (&pglob
->gl_pathv
[oldcount
],
1277 pglob
->gl_pathc
+ pglob
->gl_offs
- oldcount
,
1278 sizeof (char *), collated_compare
);
1282 if (__glibc_unlikely (malloc_dirname
))
1287 #if defined _LIBC && !defined glob
1288 libc_hidden_def (glob
)
1292 #if !defined _LIBC || !defined GLOB_ONLY_P
1294 /* Free storage allocated in PGLOB by a previous `glob' call. */
1296 globfree (glob_t
*pglob
)
1298 if (pglob
->gl_pathv
!= NULL
)
1301 for (i
= 0; i
< pglob
->gl_pathc
; ++i
)
1302 free (pglob
->gl_pathv
[pglob
->gl_offs
+ i
]);
1303 free (pglob
->gl_pathv
);
1304 pglob
->gl_pathv
= NULL
;
1307 #if defined _LIBC && !defined globfree
1308 libc_hidden_def (globfree
)
1312 /* Do a collated comparison of A and B. */
1314 collated_compare (const void *a
, const void *b
)
1316 const char *const s1
= *(const char *const * const) a
;
1317 const char *const s2
= *(const char *const * const) b
;
1325 return strcoll (s1
, s2
);
1329 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1330 elements in place. Return nonzero if out of memory, zero if successful.
1331 A slash is inserted between DIRNAME and each elt of ARRAY,
1332 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1334 prefix_array (const char *dirname
, char **array
, size_t n
)
1337 size_t dirlen
= strlen (dirname
);
1338 #if defined __MSDOS__ || defined WINDOWS32
1340 # define DIRSEP_CHAR sep_char
1342 # define DIRSEP_CHAR '/'
1345 if (dirlen
== 1 && dirname
[0] == '/')
1346 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1347 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1349 #if defined __MSDOS__ || defined WINDOWS32
1350 else if (dirlen
> 1)
1352 if (dirname
[dirlen
- 1] == '/' && dirname
[dirlen
- 2] == ':')
1353 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1355 else if (dirname
[dirlen
- 1] == ':')
1357 /* DIRNAME is "d:". Use `:' instead of `/'. */
1364 for (i
= 0; i
< n
; ++i
)
1366 size_t eltlen
= strlen (array
[i
]) + 1;
1367 char *new = (char *) malloc (dirlen
+ 1 + eltlen
);
1376 char *endp
= mempcpy (new, dirname
, dirlen
);
1377 *endp
++ = DIRSEP_CHAR
;
1378 mempcpy (endp
, array
[i
], eltlen
);
1388 /* We must not compile this function twice. */
1389 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1391 __glob_pattern_type (const char *pattern
, int quote
)
1396 for (p
= pattern
; *p
!= '\0'; ++p
)
1425 /* Return nonzero if PATTERN contains any metacharacters.
1426 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1428 __glob_pattern_p (const char *pattern
, int quote
)
1430 return __glob_pattern_type (pattern
, quote
) == 1;
1433 weak_alias (__glob_pattern_p
, glob_pattern_p
)
1437 #endif /* !GLOB_ONLY_P */
1440 /* We put this in a separate function mainly to allow the memory
1441 allocated with alloca to be recycled. */
1442 #if !defined _LIBC || !defined GLOB_ONLY_P
1444 __attribute_noinline__
1445 link_exists2_p (const char *dir
, size_t dirlen
, const char *fname
,
1452 size_t fnamelen
= strlen (fname
);
1453 char *fullname
= (char *) __alloca (dirlen
+ 1 + fnamelen
+ 1);
1459 mempcpy (mempcpy (mempcpy (fullname
, dir
, dirlen
), "/", 1),
1460 fname
, fnamelen
+ 1);
1463 return (*pglob
->gl_stat
) (fullname
, &st
) == 0;
1465 return ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1466 ? (*pglob
->gl_stat
) (fullname
, &st
)
1467 : __stat64 (fullname
, &st64
)) == 0);
1471 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1472 (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) \
1473 ? link_exists2_p (dirname, dirnamelen, fname, pglob) \
1474 : ({ struct stat64 st64; \
1475 __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0; }))
1477 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1478 link_exists2_p (dirname, dirnamelen, fname, pglob, flags)
1483 /* Like `glob', but PATTERN is a final pathname component,
1484 and matches are searched for in DIRECTORY.
1485 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1486 The GLOB_APPEND flag is assumed to be set (always appends). */
1488 glob_in_dir (const char *pattern
, const char *directory
, int flags
,
1489 int (*errfunc
) (const char *, int),
1490 glob_t
*pglob
, size_t alloca_used
)
1492 size_t dirlen
= strlen (directory
);
1493 void *stream
= NULL
;
1496 struct globnames
*next
;
1500 #define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
1501 struct globnames init_names
;
1502 struct globnames
*names
= &init_names
;
1503 struct globnames
*names_alloca
= &init_names
;
1509 alloca_used
+= sizeof (init_names
);
1511 init_names
.next
= NULL
;
1512 init_names
.count
= INITIAL_COUNT
;
1514 meta
= __glob_pattern_type (pattern
, !(flags
& GLOB_NOESCAPE
));
1515 if (meta
== 0 && (flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
1517 /* We need not do any tests. The PATTERN contains no meta
1518 characters and we must not return an error therefore the
1519 result will always contain exactly one name. */
1520 flags
|= GLOB_NOCHECK
;
1524 /* Since we use the normal file functions we can also use stat()
1525 to verify the file is there. */
1531 size_t patlen
= strlen (pattern
);
1532 int alloca_fullname
= __libc_use_alloca (alloca_used
1533 + dirlen
+ 1 + patlen
+ 1);
1535 if (alloca_fullname
)
1536 fullname
= alloca_account (dirlen
+ 1 + patlen
+ 1, alloca_used
);
1539 fullname
= malloc (dirlen
+ 1 + patlen
+ 1);
1540 if (fullname
== NULL
)
1541 return GLOB_NOSPACE
;
1544 mempcpy (mempcpy (mempcpy (fullname
, directory
, dirlen
),
1546 pattern
, patlen
+ 1);
1547 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1548 ? (*pglob
->gl_stat
) (fullname
, &ust
.st
)
1549 : __stat64 (fullname
, &ust
.st64
)) == 0)
1550 /* We found this file to be existing. Now tell the rest
1551 of the function to copy this name into the result. */
1552 flags
|= GLOB_NOCHECK
;
1554 if (__glibc_unlikely (!alloca_fullname
))
1559 stream
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1560 ? (*pglob
->gl_opendir
) (directory
)
1561 : opendir (directory
));
1564 if (errno
!= ENOTDIR
1565 && ((errfunc
!= NULL
&& (*errfunc
) (directory
, errno
))
1566 || (flags
& GLOB_ERR
)))
1567 return GLOB_ABORTED
;
1572 int dfd
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1573 ? -1 : dirfd ((DIR *) stream
));
1575 int fnm_flags
= ((!(flags
& GLOB_PERIOD
) ? FNM_PERIOD
: 0)
1576 | ((flags
& GLOB_NOESCAPE
) ? FNM_NOESCAPE
: 0)
1577 #if defined _AMIGA || defined VMS
1581 flags
|= GLOB_MAGCHAR
;
1585 struct readdir_result d
;
1587 if (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
1588 d
= convert_dirent (GL_READDIR (pglob
, stream
));
1591 #ifdef COMPILE_GLOB64
1592 d
= convert_dirent (__readdir (stream
));
1594 d
= convert_dirent64 (__readdir64 (stream
));
1603 /* If we shall match only directories use the information
1604 provided by the dirent call if possible. */
1605 if ((flags
& GLOB_ONLYDIR
) && !readdir_result_might_be_dir (d
))
1608 if (fnmatch (pattern
, d
.name
, fnm_flags
) == 0)
1610 /* If the file we found is a symlink we have to
1611 make sure the target file exists. */
1612 if (!readdir_result_might_be_symlink (d
)
1613 || link_exists_p (dfd
, directory
, dirlen
, d
.name
,
1616 if (cur
== names
->count
)
1618 struct globnames
*newnames
;
1619 size_t count
= names
->count
* 2;
1620 size_t size
= (sizeof (struct globnames
)
1621 + ((count
- INITIAL_COUNT
)
1622 * sizeof (char *)));
1623 if (__libc_use_alloca (alloca_used
+ size
))
1624 newnames
= names_alloca
1625 = alloca_account (size
, alloca_used
);
1626 else if ((newnames
= malloc (size
))
1629 newnames
->count
= count
;
1630 newnames
->next
= names
;
1634 names
->name
[cur
] = strdup (d
.name
);
1635 if (names
->name
[cur
] == NULL
)
1645 if (nfound
== 0 && (flags
& GLOB_NOCHECK
))
1647 size_t len
= strlen (pattern
);
1649 names
->name
[cur
] = (char *) malloc (len
+ 1);
1650 if (names
->name
[cur
] == NULL
)
1652 *((char *) mempcpy (names
->name
[cur
++], pattern
, len
)) = '\0';
1655 int result
= GLOB_NOMATCH
;
1660 if (pglob
->gl_pathc
> UINTPTR_MAX
- pglob
->gl_offs
1661 || pglob
->gl_pathc
+ pglob
->gl_offs
> UINTPTR_MAX
- nfound
1662 || pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
> UINTPTR_MAX
- 1
1663 || (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1
1664 > UINTPTR_MAX
/ sizeof (char *)))
1667 char **new_gl_pathv
;
1669 = (char **) realloc (pglob
->gl_pathv
,
1670 (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1)
1672 if (new_gl_pathv
== NULL
)
1677 struct globnames
*old
= names
;
1678 for (size_t i
= 0; i
< cur
; ++i
)
1679 free (names
->name
[i
]);
1680 names
= names
->next
;
1681 /* NB: we will not leak memory here if we exit without
1682 freeing the current block assigned to OLD. At least
1683 the very first block is always allocated on the stack
1684 and this is the block assigned to OLD here. */
1687 assert (old
== &init_names
);
1691 if (old
== names_alloca
)
1692 names_alloca
= names
;
1696 result
= GLOB_NOSPACE
;
1702 struct globnames
*old
= names
;
1703 for (size_t i
= 0; i
< cur
; ++i
)
1704 new_gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
++]
1706 names
= names
->next
;
1707 /* NB: we will not leak memory here if we exit without
1708 freeing the current block assigned to OLD. At least
1709 the very first block is always allocated on the stack
1710 and this is the block assigned to OLD here. */
1713 assert (old
== &init_names
);
1717 if (old
== names_alloca
)
1718 names_alloca
= names
;
1723 pglob
->gl_pathv
= new_gl_pathv
;
1725 pglob
->gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
] = NULL
;
1727 pglob
->gl_flags
= flags
;
1734 if (__glibc_unlikely (flags
& GLOB_ALTDIRFUNC
))
1735 (*pglob
->gl_closedir
) (stream
);