1 /* Copyright (C) 1991-2013 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
) __THROW
;
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
) __THROW
;
212 static int collated_compare (const void *, const void *) __THROW
;
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 if (!(flags
& GLOB_DOOFFS
))
280 /* Have to do this so `globfree' knows where to start freeing. It
281 also makes all the code that uses gl_offs simpler. */
284 if (flags
& GLOB_BRACE
)
288 if (flags
& GLOB_NOESCAPE
)
289 begin
= strchr (pattern
, '{');
301 if (*begin
== '\\' && begin
[1] != '\0')
303 else if (*begin
== '{')
312 /* Allocate working buffer large enough for our work. Note that
313 we have at least an opening and closing brace. */
321 size_t pattern_len
= strlen (pattern
) - 1;
323 int alloca_onealt
= __libc_use_alloca (alloca_used
+ pattern_len
);
325 onealt
= alloca_account (pattern_len
, alloca_used
);
329 onealt
= (char *) malloc (pattern_len
);
332 if (!(flags
& GLOB_APPEND
))
335 pglob
->gl_pathv
= NULL
;
341 /* We know the prefix for all sub-patterns. */
342 alt_start
= mempcpy (onealt
, pattern
, begin
- pattern
);
344 /* Find the first sub-pattern and at the same time find the
345 rest after the closing brace. */
346 next
= next_brace_sub (begin
+ 1, flags
);
349 /* It is an illegal expression. */
352 if (__builtin_expect (!alloca_onealt
, 0))
355 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
358 /* Now find the end of the whole brace expression. */
362 rest
= next_brace_sub (rest
+ 1, flags
);
364 /* It is an illegal expression. */
367 /* Please note that we now can be sure the brace expression
369 rest_len
= strlen (++rest
) + 1;
371 /* We have a brace expression. BEGIN points to the opening {,
372 NEXT points past the terminator of the first element, and END
373 points past the final }. We will accumulate result names from
374 recursive runs for each brace alternative in the buffer using
377 if (!(flags
& GLOB_APPEND
))
379 /* This call is to set a new vector, so clear out the
380 vector so we can append to it. */
382 pglob
->gl_pathv
= NULL
;
384 firstc
= pglob
->gl_pathc
;
391 /* Construct the new glob expression. */
392 mempcpy (mempcpy (alt_start
, p
, next
- p
), rest
, rest_len
);
394 result
= glob (onealt
,
395 ((flags
& ~(GLOB_NOCHECK
| GLOB_NOMAGIC
))
396 | GLOB_APPEND
), errfunc
, pglob
);
398 /* If we got an error, return it. */
399 if (result
&& result
!= GLOB_NOMATCH
)
402 if (__builtin_expect (!alloca_onealt
, 0))
405 if (!(flags
& GLOB_APPEND
))
414 /* We saw the last entry. */
418 next
= next_brace_sub (p
, flags
);
419 assert (next
!= NULL
);
423 if (__builtin_expect (!alloca_onealt
, 0))
427 if (pglob
->gl_pathc
!= firstc
)
428 /* We found some entries. */
430 else if (!(flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
435 if (!(flags
& GLOB_APPEND
))
438 if (!(flags
& GLOB_DOOFFS
))
439 pglob
->gl_pathv
= NULL
;
444 if (pglob
->gl_offs
>= ~((size_t) 0) / sizeof (char *))
447 pglob
->gl_pathv
= (char **) malloc ((pglob
->gl_offs
+ 1)
449 if (pglob
->gl_pathv
== NULL
)
452 for (i
= 0; i
<= pglob
->gl_offs
; ++i
)
453 pglob
->gl_pathv
[i
] = NULL
;
457 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
459 /* Find the filename. */
460 filename
= strrchr (pattern
, '/');
461 #if defined __MSDOS__ || defined WINDOWS32
462 /* The case of "d:pattern". Since `:' is not allowed in
463 file names, we can safely assume that wherever it
464 happens in pattern, it signals the filename part. This
465 is so we could some day support patterns like "[a-z]:foo". */
466 if (filename
== NULL
)
467 filename
= strchr (pattern
, ':');
468 #endif /* __MSDOS__ || WINDOWS32 */
469 dirname_modified
= 0;
470 if (filename
== NULL
)
472 /* This can mean two things: a simple name or "~name". The latter
473 case is nothing but a notation for a directory. */
474 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && pattern
[0] == '~')
476 dirname
= (char *) pattern
;
477 dirlen
= strlen (pattern
);
479 /* Set FILENAME to NULL as a special flag. This is ugly but
480 other solutions would require much more code. We test for
481 this special case below. */
486 if (__builtin_expect (pattern
[0] == '\0', 0))
488 dirs
.gl_pathv
= NULL
;
494 dirname
= (char *) "";
496 dirname
= (char *) ".";
501 else if (filename
== pattern
502 || (filename
== pattern
+ 1 && pattern
[0] == '\\'
503 && (flags
& GLOB_NOESCAPE
) == 0))
505 /* "/pattern" or "\\/pattern". */
506 dirname
= (char *) "/";
513 dirlen
= filename
- pattern
;
514 #if defined __MSDOS__ || defined WINDOWS32
516 || (filename
> pattern
+ 1 && filename
[-1] == ':'))
521 drive_spec
= (char *) __alloca (dirlen
+ 1);
522 *((char *) mempcpy (drive_spec
, pattern
, dirlen
)) = '\0';
523 /* For now, disallow wildcards in the drive spec, to
524 prevent infinite recursion in glob. */
525 if (__glob_pattern_p (drive_spec
, !(flags
& GLOB_NOESCAPE
)))
527 /* If this is "d:pattern", we need to copy `:' to DIRNAME
528 as well. If it's "d:/pattern", don't remove the slash
529 from "d:/", since "d:" and "d:/" are not the same.*/
533 if (__libc_use_alloca (alloca_used
+ dirlen
+ 1))
534 newp
= alloca_account (dirlen
+ 1, alloca_used
);
538 newp
= malloc (dirlen
+ 1);
543 *((char *) mempcpy (newp
, pattern
, dirlen
)) = '\0';
547 if (filename
[0] == '\0'
548 #if defined __MSDOS__ || defined WINDOWS32
549 && dirname
[dirlen
- 1] != ':'
550 && (dirlen
< 3 || dirname
[dirlen
- 2] != ':'
551 || dirname
[dirlen
- 1] != '/')
554 /* "pattern/". Expand "pattern", appending slashes. */
556 int orig_flags
= flags
;
557 if (!(flags
& GLOB_NOESCAPE
) && dirname
[dirlen
- 1] == '\\')
559 /* "pattern\\/". Remove the final backslash if it hasn't
561 char *p
= (char *) &dirname
[dirlen
- 1];
563 while (p
> dirname
&& p
[-1] == '\\') --p
;
564 if ((&dirname
[dirlen
] - p
) & 1)
566 *(char *) &dirname
[--dirlen
] = '\0';
567 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
570 int val
= glob (dirname
, flags
| GLOB_MARK
, errfunc
, pglob
);
572 pglob
->gl_flags
= ((pglob
->gl_flags
& ~GLOB_MARK
)
573 | (flags
& GLOB_MARK
));
574 else if (val
== GLOB_NOMATCH
&& flags
!= orig_flags
)
576 /* Make sure globfree (&dirs); is a nop. */
577 dirs
.gl_pathv
= NULL
;
579 oldcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
588 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && dirname
[0] == '~')
590 if (dirname
[1] == '\0' || dirname
[1] == '/'
591 || (!(flags
& GLOB_NOESCAPE
) && dirname
[1] == '\\'
592 && (dirname
[2] == '\0' || dirname
[2] == '/')))
594 /* Look up home directory. */
595 char *home_dir
= getenv ("HOME");
596 int malloc_home_dir
= 0;
598 if (home_dir
== NULL
|| home_dir
[0] == '\0')
602 if (home_dir
== NULL
|| home_dir
[0] == '\0')
603 home_dir
= "c:/users/default"; /* poor default */
605 if (home_dir
== NULL
|| home_dir
[0] == '\0')
609 size_t buflen
= GET_LOGIN_NAME_MAX () + 1;
612 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
615 name
= alloca_account (buflen
, alloca_used
);
617 success
= getlogin_r (name
, buflen
) == 0;
621 # if defined HAVE_GETPWNAM_R || defined _LIBC
622 long int pwbuflen
= GETPW_R_SIZE_MAX ();
625 int malloc_pwtmpbuf
= 0;
630 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
631 Try a moderate value. */
634 if (__libc_use_alloca (alloca_used
+ pwbuflen
))
635 pwtmpbuf
= alloca_account (pwbuflen
, alloca_used
);
638 pwtmpbuf
= malloc (pwbuflen
);
639 if (pwtmpbuf
== NULL
)
641 retval
= GLOB_NOSPACE
;
647 while (getpwnam_r (name
, &pwbuf
, pwtmpbuf
, pwbuflen
, &p
)
657 && __libc_use_alloca (alloca_used
659 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, pwbuflen
,
664 char *newp
= realloc (malloc_pwtmpbuf
669 if (__builtin_expect (malloc_pwtmpbuf
, 0))
671 retval
= GLOB_NOSPACE
;
675 pwbuflen
= 2 * pwbuflen
;
685 if (!malloc_pwtmpbuf
)
686 home_dir
= p
->pw_dir
;
689 size_t home_dir_len
= strlen (p
->pw_dir
) + 1;
690 if (__libc_use_alloca (alloca_used
+ home_dir_len
))
691 home_dir
= alloca_account (home_dir_len
,
695 home_dir
= malloc (home_dir_len
);
696 if (home_dir
== NULL
)
699 retval
= GLOB_NOSPACE
;
704 memcpy (home_dir
, p
->pw_dir
, home_dir_len
);
711 if (home_dir
== NULL
|| home_dir
[0] == '\0')
713 if (flags
& GLOB_TILDE_CHECK
)
715 if (__builtin_expect (malloc_home_dir
, 0))
717 retval
= GLOB_NOMATCH
;
721 home_dir
= (char *) "~"; /* No luck. */
723 # endif /* WINDOWS32 */
725 /* Now construct the full directory. */
726 if (dirname
[1] == '\0')
728 if (__builtin_expect (malloc_dirname
, 0))
732 dirlen
= strlen (dirname
);
733 malloc_dirname
= malloc_home_dir
;
738 size_t home_len
= strlen (home_dir
);
739 int use_alloca
= __libc_use_alloca (alloca_used
740 + home_len
+ dirlen
);
742 newp
= alloca_account (home_len
+ dirlen
, alloca_used
);
745 newp
= malloc (home_len
+ dirlen
);
748 if (__builtin_expect (malloc_home_dir
, 0))
750 retval
= GLOB_NOSPACE
;
755 mempcpy (mempcpy (newp
, home_dir
, home_len
),
756 &dirname
[1], dirlen
);
758 if (__builtin_expect (malloc_dirname
, 0))
762 dirlen
+= home_len
- 1;
763 malloc_dirname
= !use_alloca
;
765 dirname_modified
= 1;
767 # if !defined _AMIGA && !defined WINDOWS32
770 char *end_name
= strchr (dirname
, '/');
772 int malloc_user_name
= 0;
773 char *unescape
= NULL
;
775 if (!(flags
& GLOB_NOESCAPE
))
777 if (end_name
== NULL
)
779 unescape
= strchr (dirname
, '\\');
781 end_name
= strchr (unescape
, '\0');
784 unescape
= memchr (dirname
, '\\', end_name
- dirname
);
786 if (end_name
== NULL
)
787 user_name
= dirname
+ 1;
791 if (__libc_use_alloca (alloca_used
+ (end_name
- dirname
)))
792 newp
= alloca_account (end_name
- dirname
, alloca_used
);
795 newp
= malloc (end_name
- dirname
);
798 retval
= GLOB_NOSPACE
;
801 malloc_user_name
= 1;
803 if (unescape
!= NULL
)
805 char *p
= mempcpy (newp
, dirname
+ 1,
806 unescape
- dirname
- 1);
814 /* "~fo\\o\\" unescape to user_name "foo\\",
815 but "~fo\\o\\/" unescape to user_name
817 if (filename
== NULL
)
828 *((char *) mempcpy (newp
, dirname
+ 1, end_name
- dirname
))
833 /* Look up specific user's home directory. */
836 # if defined HAVE_GETPWNAM_R || defined _LIBC
837 long int buflen
= GETPW_R_SIZE_MAX ();
839 int malloc_pwtmpbuf
= 0;
845 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
849 if (__libc_use_alloca (alloca_used
+ buflen
))
850 pwtmpbuf
= alloca_account (buflen
, alloca_used
);
853 pwtmpbuf
= malloc (buflen
);
854 if (pwtmpbuf
== NULL
)
857 if (__builtin_expect (malloc_user_name
, 0))
859 retval
= GLOB_NOSPACE
;
865 while (getpwnam_r (user_name
, &pwbuf
, pwtmpbuf
, buflen
, &p
) != 0)
873 && __libc_use_alloca (alloca_used
+ 2 * buflen
))
874 pwtmpbuf
= extend_alloca_account (pwtmpbuf
, buflen
,
875 2 * buflen
, alloca_used
);
878 char *newp
= realloc (malloc_pwtmpbuf
? pwtmpbuf
: NULL
,
882 if (__builtin_expect (malloc_pwtmpbuf
, 0))
892 p
= getpwnam (user_name
);
895 if (__builtin_expect (malloc_user_name
, 0))
898 /* If we found a home directory use this. */
901 size_t home_len
= strlen (p
->pw_dir
);
902 size_t rest_len
= end_name
== NULL
? 0 : strlen (end_name
);
904 if (__builtin_expect (malloc_dirname
, 0))
908 if (__libc_use_alloca (alloca_used
+ home_len
+ rest_len
+ 1))
909 dirname
= alloca_account (home_len
+ rest_len
+ 1,
913 dirname
= malloc (home_len
+ rest_len
+ 1);
916 if (__builtin_expect (malloc_pwtmpbuf
, 0))
918 retval
= GLOB_NOSPACE
;
923 *((char *) mempcpy (mempcpy (dirname
, p
->pw_dir
, home_len
),
924 end_name
, rest_len
)) = '\0';
926 dirlen
= home_len
+ rest_len
;
927 dirname_modified
= 1;
929 if (__builtin_expect (malloc_pwtmpbuf
, 0))
934 if (__builtin_expect (malloc_pwtmpbuf
, 0))
937 if (flags
& GLOB_TILDE_CHECK
)
938 /* We have to regard it as an error if we cannot find the
944 # endif /* Not Amiga && not WINDOWS32. */
946 #endif /* Not VMS. */
948 /* Now test whether we looked for "~" or "~NAME". In this case we
949 can give the answer now. */
950 if (filename
== NULL
)
955 /* Return the directory if we don't check for error or if it exists. */
956 if ((flags
& GLOB_NOCHECK
)
957 || (((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
958 ? ((*pglob
->gl_stat
) (dirname
, &st
) == 0
959 && S_ISDIR (st
.st_mode
))
960 : (__stat64 (dirname
, &st64
) == 0 && S_ISDIR (st64
.st_mode
)))))
962 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
965 if (newcount
> UINTPTR_MAX
- (1 + 1)
966 || newcount
+ 1 + 1 > ~((size_t) 0) / sizeof (char *))
969 free (pglob
->gl_pathv
);
970 pglob
->gl_pathv
= NULL
;
976 = (char **) realloc (pglob
->gl_pathv
,
977 (newcount
+ 1 + 1) * sizeof (char *));
978 if (new_gl_pathv
== NULL
)
980 pglob
->gl_pathv
= new_gl_pathv
;
982 if (flags
& GLOB_MARK
)
985 pglob
->gl_pathv
[newcount
] = malloc (dirlen
+ 2);
986 if (pglob
->gl_pathv
[newcount
] == NULL
)
988 p
= mempcpy (pglob
->gl_pathv
[newcount
], dirname
, dirlen
);
994 pglob
->gl_pathv
[newcount
] = strdup (dirname
);
995 if (pglob
->gl_pathv
[newcount
] == NULL
)
998 pglob
->gl_pathv
[++newcount
] = NULL
;
1000 pglob
->gl_flags
= flags
;
1006 return GLOB_NOMATCH
;
1009 meta
= __glob_pattern_type (dirname
, !(flags
& GLOB_NOESCAPE
));
1010 /* meta is 1 if correct glob pattern containing metacharacters.
1011 If meta has bit (1 << 2) set, it means there was an unterminated
1012 [ which we handle the same, using fnmatch. Broken unterminated
1013 pattern bracket expressions ought to be rare enough that it is
1014 not worth special casing them, fnmatch will do the right thing. */
1017 /* The directory name contains metacharacters, so we
1018 have to glob for the directory, and then glob for
1019 the pattern in each directory found. */
1022 if (!(flags
& GLOB_NOESCAPE
) && dirlen
> 0 && dirname
[dirlen
- 1] == '\\')
1024 /* "foo\\/bar". Remove the final backslash from dirname
1025 if it has not been quoted. */
1026 char *p
= (char *) &dirname
[dirlen
- 1];
1028 while (p
> dirname
&& p
[-1] == '\\') --p
;
1029 if ((&dirname
[dirlen
] - p
) & 1)
1030 *(char *) &dirname
[--dirlen
] = '\0';
1033 if (__builtin_expect ((flags
& GLOB_ALTDIRFUNC
) != 0, 0))
1035 /* Use the alternative access functions also in the recursive
1037 dirs
.gl_opendir
= pglob
->gl_opendir
;
1038 dirs
.gl_readdir
= pglob
->gl_readdir
;
1039 dirs
.gl_closedir
= pglob
->gl_closedir
;
1040 dirs
.gl_stat
= pglob
->gl_stat
;
1041 dirs
.gl_lstat
= pglob
->gl_lstat
;
1044 status
= glob (dirname
,
1045 ((flags
& (GLOB_ERR
| GLOB_NOESCAPE
1047 | GLOB_NOSORT
| GLOB_ONLYDIR
),
1051 if ((flags
& GLOB_NOCHECK
) == 0 || status
!= GLOB_NOMATCH
)
1056 /* We have successfully globbed the preceding directory name.
1057 For each name we found, call glob_in_dir on it and FILENAME,
1058 appending the results to PGLOB. */
1059 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
1065 /* Make globbing interruptible in the bash shell. */
1066 extern int interrupt_state
;
1068 if (interrupt_state
)
1071 return GLOB_ABORTED
;
1076 old_pathc
= pglob
->gl_pathc
;
1077 status
= glob_in_dir (filename
, dirs
.gl_pathv
[i
],
1078 ((flags
| GLOB_APPEND
)
1079 & ~(GLOB_NOCHECK
| GLOB_NOMAGIC
)),
1080 errfunc
, pglob
, alloca_used
);
1081 if (status
== GLOB_NOMATCH
)
1082 /* No matches in this directory. Try the next. */
1089 pglob
->gl_pathc
= 0;
1093 /* Stick the directory on the front of each name. */
1094 if (prefix_array (dirs
.gl_pathv
[i
],
1095 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1096 pglob
->gl_pathc
- old_pathc
))
1100 pglob
->gl_pathc
= 0;
1101 return GLOB_NOSPACE
;
1105 flags
|= GLOB_MAGCHAR
;
1107 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
1108 But if we have not found any matching entry and the GLOB_NOCHECK
1109 flag was set we must return the input pattern itself. */
1110 if (pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1114 if (flags
& GLOB_NOCHECK
)
1116 size_t newcount
= pglob
->gl_pathc
+ pglob
->gl_offs
;
1117 char **new_gl_pathv
;
1119 if (newcount
> UINTPTR_MAX
- 2
1120 || newcount
+ 2 > ~((size_t) 0) / sizeof (char *))
1124 return GLOB_NOSPACE
;
1127 new_gl_pathv
= (char **) realloc (pglob
->gl_pathv
,
1130 if (new_gl_pathv
== NULL
)
1132 pglob
->gl_pathv
= new_gl_pathv
;
1134 pglob
->gl_pathv
[newcount
] = __strdup (pattern
);
1135 if (pglob
->gl_pathv
[newcount
] == NULL
)
1139 pglob
->gl_pathc
= 0;
1140 return GLOB_NOSPACE
;
1146 pglob
->gl_pathv
[newcount
] = NULL
;
1147 pglob
->gl_flags
= flags
;
1152 return GLOB_NOMATCH
;
1160 size_t old_pathc
= pglob
->gl_pathc
;
1161 int orig_flags
= flags
;
1165 char *p
= strchr (dirname
, '\\'), *q
;
1166 /* We need to unescape the dirname string. It is certainly
1167 allocated by alloca, as otherwise filename would be NULL
1168 or dirname wouldn't contain backslashes. */
1181 while (*p
++ != '\0');
1182 dirname_modified
= 1;
1184 if (dirname_modified
)
1185 flags
&= ~(GLOB_NOCHECK
| GLOB_NOMAGIC
);
1186 status
= glob_in_dir (filename
, dirname
, flags
, errfunc
, pglob
,
1190 if (status
== GLOB_NOMATCH
&& flags
!= orig_flags
1191 && pglob
->gl_pathc
+ pglob
->gl_offs
== oldcount
)
1193 /* Make sure globfree (&dirs); is a nop. */
1194 dirs
.gl_pathv
= NULL
;
1203 /* Stick the directory on the front of each name. */
1204 if (prefix_array (dirname
,
1205 &pglob
->gl_pathv
[old_pathc
+ pglob
->gl_offs
],
1206 pglob
->gl_pathc
- old_pathc
))
1209 pglob
->gl_pathc
= 0;
1210 return GLOB_NOSPACE
;
1215 if (flags
& GLOB_MARK
)
1217 /* Append slashes to directory names. */
1222 for (i
= oldcount
; i
< pglob
->gl_pathc
+ pglob
->gl_offs
; ++i
)
1223 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1224 ? ((*pglob
->gl_stat
) (pglob
->gl_pathv
[i
], &st
) == 0
1225 && S_ISDIR (st
.st_mode
))
1226 : (__stat64 (pglob
->gl_pathv
[i
], &st64
) == 0
1227 && S_ISDIR (st64
.st_mode
))))
1229 size_t len
= strlen (pglob
->gl_pathv
[i
]) + 2;
1230 char *new = realloc (pglob
->gl_pathv
[i
], len
);
1234 pglob
->gl_pathc
= 0;
1235 return GLOB_NOSPACE
;
1237 strcpy (&new[len
- 2], "/");
1238 pglob
->gl_pathv
[i
] = new;
1242 if (!(flags
& GLOB_NOSORT
))
1244 /* Sort the vector. */
1245 qsort (&pglob
->gl_pathv
[oldcount
],
1246 pglob
->gl_pathc
+ pglob
->gl_offs
- oldcount
,
1247 sizeof (char *), collated_compare
);
1251 if (__builtin_expect (malloc_dirname
, 0))
1256 #if defined _LIBC && !defined glob
1257 libc_hidden_def (glob
)
1261 #if !defined _LIBC || !defined GLOB_ONLY_P
1263 /* Free storage allocated in PGLOB by a previous `glob' call. */
1268 if (pglob
->gl_pathv
!= NULL
)
1271 for (i
= 0; i
< pglob
->gl_pathc
; ++i
)
1272 free (pglob
->gl_pathv
[pglob
->gl_offs
+ i
]);
1273 free (pglob
->gl_pathv
);
1274 pglob
->gl_pathv
= NULL
;
1277 #if defined _LIBC && !defined globfree
1278 libc_hidden_def (globfree
)
1282 /* Do a collated comparison of A and B. */
1284 collated_compare (const void *a
, const void *b
)
1286 const char *const s1
= *(const char *const * const) a
;
1287 const char *const s2
= *(const char *const * const) b
;
1295 return strcoll (s1
, s2
);
1299 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1300 elements in place. Return nonzero if out of memory, zero if successful.
1301 A slash is inserted between DIRNAME and each elt of ARRAY,
1302 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1304 prefix_array (const char *dirname
, char **array
, size_t n
)
1307 size_t dirlen
= strlen (dirname
);
1308 #if defined __MSDOS__ || defined WINDOWS32
1310 # define DIRSEP_CHAR sep_char
1312 # define DIRSEP_CHAR '/'
1315 if (dirlen
== 1 && dirname
[0] == '/')
1316 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1317 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1319 #if defined __MSDOS__ || defined WINDOWS32
1320 else if (dirlen
> 1)
1322 if (dirname
[dirlen
- 1] == '/' && dirname
[dirlen
- 2] == ':')
1323 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1325 else if (dirname
[dirlen
- 1] == ':')
1327 /* DIRNAME is "d:". Use `:' instead of `/'. */
1334 for (i
= 0; i
< n
; ++i
)
1336 size_t eltlen
= strlen (array
[i
]) + 1;
1337 char *new = (char *) malloc (dirlen
+ 1 + eltlen
);
1346 char *endp
= mempcpy (new, dirname
, dirlen
);
1347 *endp
++ = DIRSEP_CHAR
;
1348 mempcpy (endp
, array
[i
], eltlen
);
1358 /* We must not compile this function twice. */
1359 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1361 __glob_pattern_type (pattern
, quote
)
1362 const char *pattern
;
1368 for (p
= pattern
; *p
!= '\0'; ++p
)
1397 /* Return nonzero if PATTERN contains any metacharacters.
1398 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1400 __glob_pattern_p (pattern
, quote
)
1401 const char *pattern
;
1404 return __glob_pattern_type (pattern
, quote
) == 1;
1407 weak_alias (__glob_pattern_p
, glob_pattern_p
)
1411 #endif /* !GLOB_ONLY_P */
1414 /* We put this in a separate function mainly to allow the memory
1415 allocated with alloca to be recycled. */
1416 #if !defined _LIBC || !defined GLOB_ONLY_P
1418 __attribute_noinline__
1419 link_exists2_p (const char *dir
, size_t dirlen
, const char *fname
,
1426 size_t fnamelen
= strlen (fname
);
1427 char *fullname
= (char *) __alloca (dirlen
+ 1 + fnamelen
+ 1);
1433 mempcpy (mempcpy (mempcpy (fullname
, dir
, dirlen
), "/", 1),
1434 fname
, fnamelen
+ 1);
1437 return (*pglob
->gl_stat
) (fullname
, &st
) == 0;
1439 return ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1440 ? (*pglob
->gl_stat
) (fullname
, &st
)
1441 : __stat64 (fullname
, &st64
)) == 0);
1445 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1446 (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) \
1447 ? link_exists2_p (dirname, dirnamelen, fname, pglob) \
1448 : ({ struct stat64 st64; \
1449 __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0; }))
1451 # define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
1452 link_exists2_p (dirname, dirnamelen, fname, pglob, flags)
1457 /* Like `glob', but PATTERN is a final pathname component,
1458 and matches are searched for in DIRECTORY.
1459 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1460 The GLOB_APPEND flag is assumed to be set (always appends). */
1462 glob_in_dir (const char *pattern
, const char *directory
, int flags
,
1463 int (*errfunc
) (const char *, int),
1464 glob_t
*pglob
, size_t alloca_used
)
1466 size_t dirlen
= strlen (directory
);
1467 void *stream
= NULL
;
1470 struct globnames
*next
;
1474 #define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
1475 struct globnames init_names
;
1476 struct globnames
*names
= &init_names
;
1477 struct globnames
*names_alloca
= &init_names
;
1483 alloca_used
+= sizeof (init_names
);
1485 init_names
.next
= NULL
;
1486 init_names
.count
= INITIAL_COUNT
;
1488 meta
= __glob_pattern_type (pattern
, !(flags
& GLOB_NOESCAPE
));
1489 if (meta
== 0 && (flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
1491 /* We need not do any tests. The PATTERN contains no meta
1492 characters and we must not return an error therefore the
1493 result will always contain exactly one name. */
1494 flags
|= GLOB_NOCHECK
;
1498 /* Since we use the normal file functions we can also use stat()
1499 to verify the file is there. */
1505 size_t patlen
= strlen (pattern
);
1506 int alloca_fullname
= __libc_use_alloca (alloca_used
1507 + dirlen
+ 1 + patlen
+ 1);
1509 if (alloca_fullname
)
1510 fullname
= alloca_account (dirlen
+ 1 + patlen
+ 1, alloca_used
);
1513 fullname
= malloc (dirlen
+ 1 + patlen
+ 1);
1514 if (fullname
== NULL
)
1515 return GLOB_NOSPACE
;
1518 mempcpy (mempcpy (mempcpy (fullname
, directory
, dirlen
),
1520 pattern
, patlen
+ 1);
1521 if ((__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1522 ? (*pglob
->gl_stat
) (fullname
, &ust
.st
)
1523 : __stat64 (fullname
, &ust
.st64
)) == 0)
1524 /* We found this file to be existing. Now tell the rest
1525 of the function to copy this name into the result. */
1526 flags
|= GLOB_NOCHECK
;
1528 if (__builtin_expect (!alloca_fullname
, 0))
1533 stream
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1534 ? (*pglob
->gl_opendir
) (directory
)
1535 : opendir (directory
));
1538 if (errno
!= ENOTDIR
1539 && ((errfunc
!= NULL
&& (*errfunc
) (directory
, errno
))
1540 || (flags
& GLOB_ERR
)))
1541 return GLOB_ABORTED
;
1546 int dfd
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1547 ? -1 : dirfd ((DIR *) stream
));
1549 int fnm_flags
= ((!(flags
& GLOB_PERIOD
) ? FNM_PERIOD
: 0)
1550 | ((flags
& GLOB_NOESCAPE
) ? FNM_NOESCAPE
: 0)
1551 #if defined _AMIGA || defined VMS
1555 flags
|= GLOB_MAGCHAR
;
1561 #if defined _LIBC && !defined COMPILE_GLOB64
1565 struct dirent64 d64
;
1566 char room
[offsetof (struct dirent64
, d_name
[0])
1571 if (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
1573 struct dirent
*d32
= (*pglob
->gl_readdir
) (stream
);
1576 CONVERT_DIRENT_DIRENT64 (&d64buf
.d64
, d32
);
1583 d
= __readdir64 (stream
);
1585 struct dirent
*d
= (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0)
1586 ? ((struct dirent
*)
1587 (*pglob
->gl_readdir
) (stream
))
1588 : __readdir (stream
));
1592 if (! REAL_DIR_ENTRY (d
))
1595 /* If we shall match only directories use the information
1596 provided by the dirent call if possible. */
1597 if ((flags
& GLOB_ONLYDIR
) && !DIRENT_MIGHT_BE_DIR (d
))
1602 if (fnmatch (pattern
, name
, fnm_flags
) == 0)
1604 /* If the file we found is a symlink we have to
1605 make sure the target file exists. */
1606 if (!DIRENT_MIGHT_BE_SYMLINK (d
)
1607 || link_exists_p (dfd
, directory
, dirlen
, name
, pglob
,
1610 if (cur
== names
->count
)
1612 struct globnames
*newnames
;
1613 size_t count
= names
->count
* 2;
1614 size_t size
= (sizeof (struct globnames
)
1615 + ((count
- INITIAL_COUNT
)
1616 * sizeof (char *)));
1617 if (__libc_use_alloca (alloca_used
+ size
))
1618 newnames
= names_alloca
1619 = alloca_account (size
, alloca_used
);
1620 else if ((newnames
= malloc (size
))
1623 newnames
->count
= count
;
1624 newnames
->next
= names
;
1629 names
->name
[cur
] = (char *) malloc (len
+ 1);
1630 if (names
->name
[cur
] == NULL
)
1632 *((char *) mempcpy (names
->name
[cur
++], name
, len
))
1641 if (nfound
== 0 && (flags
& GLOB_NOCHECK
))
1643 size_t len
= strlen (pattern
);
1645 names
->name
[cur
] = (char *) malloc (len
+ 1);
1646 if (names
->name
[cur
] == NULL
)
1648 *((char *) mempcpy (names
->name
[cur
++], pattern
, len
)) = '\0';
1651 int result
= GLOB_NOMATCH
;
1656 if (pglob
->gl_pathc
> UINTPTR_MAX
- pglob
->gl_offs
1657 || pglob
->gl_pathc
+ pglob
->gl_offs
> UINTPTR_MAX
- nfound
1658 || pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
> UINTPTR_MAX
- 1
1659 || (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1
1660 > UINTPTR_MAX
/ sizeof (char *)))
1663 char **new_gl_pathv
;
1665 = (char **) realloc (pglob
->gl_pathv
,
1666 (pglob
->gl_pathc
+ pglob
->gl_offs
+ nfound
+ 1)
1668 if (new_gl_pathv
== NULL
)
1673 struct globnames
*old
= names
;
1674 for (size_t i
= 0; i
< cur
; ++i
)
1675 free (names
->name
[i
]);
1676 names
= names
->next
;
1677 /* NB: we will not leak memory here if we exit without
1678 freeing the current block assigned to OLD. At least
1679 the very first block is always allocated on the stack
1680 and this is the block assigned to OLD here. */
1683 assert (old
== &init_names
);
1687 if (old
== names_alloca
)
1688 names_alloca
= names
;
1692 result
= GLOB_NOSPACE
;
1698 struct globnames
*old
= names
;
1699 for (size_t i
= 0; i
< cur
; ++i
)
1700 new_gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
++]
1702 names
= names
->next
;
1703 /* NB: we will not leak memory here if we exit without
1704 freeing the current block assigned to OLD. At least
1705 the very first block is always allocated on the stack
1706 and this is the block assigned to OLD here. */
1709 assert (old
== &init_names
);
1713 if (old
== names_alloca
)
1714 names_alloca
= names
;
1719 pglob
->gl_pathv
= new_gl_pathv
;
1721 pglob
->gl_pathv
[pglob
->gl_offs
+ pglob
->gl_pathc
] = NULL
;
1723 pglob
->gl_flags
= flags
;
1730 if (__builtin_expect (flags
& GLOB_ALTDIRFUNC
, 0))
1731 (*pglob
->gl_closedir
) (stream
);