.
[glibc/history.git] / posix / glob.c
blobd2a9981e31083074a144cd74076949ab49c1365f
1 /* Copyright (C) 1991-2002,2003,2004,2005,2006 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, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17 02111-1307 USA. */
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
23 #include <glob.h>
25 #include <errno.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <stddef.h>
30 /* Outcomment the following line for production quality code. */
31 /* #define NDEBUG 1 */
32 #include <assert.h>
34 #include <stdio.h> /* Needed on stupid SunOS for assert. */
36 #if !defined _LIBC || !defined GLOB_ONLY_P
37 #if defined HAVE_UNISTD_H || defined _LIBC
38 # include <unistd.h>
39 # ifndef POSIX
40 # ifdef _POSIX_VERSION
41 # define POSIX
42 # endif
43 # endif
44 #endif
46 #include <pwd.h>
48 #include <errno.h>
49 #ifndef __set_errno
50 # define __set_errno(val) errno = (val)
51 #endif
53 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
54 # include <dirent.h>
55 # define NAMLEN(dirent) strlen((dirent)->d_name)
56 #else
57 # define dirent direct
58 # define NAMLEN(dirent) (dirent)->d_namlen
59 # ifdef HAVE_SYS_NDIR_H
60 # include <sys/ndir.h>
61 # endif
62 # ifdef HAVE_SYS_DIR_H
63 # include <sys/dir.h>
64 # endif
65 # ifdef HAVE_NDIR_H
66 # include <ndir.h>
67 # endif
68 # ifdef HAVE_VMSDIR_H
69 # include "vmsdir.h"
70 # endif /* HAVE_VMSDIR_H */
71 #endif
74 /* In GNU systems, <dirent.h> defines this macro for us. */
75 #ifdef _D_NAMLEN
76 # undef NAMLEN
77 # define NAMLEN(d) _D_NAMLEN(d)
78 #endif
80 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
81 if the `d_type' member for `struct dirent' is available.
82 HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
83 #if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
84 /* True if the directory entry D must be of type T. */
85 # define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
87 /* True if the directory entry D might be a symbolic link. */
88 # define DIRENT_MIGHT_BE_SYMLINK(d) \
89 ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
91 /* True if the directory entry D might be a directory. */
92 # define DIRENT_MIGHT_BE_DIR(d) \
93 ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
95 #else /* !HAVE_D_TYPE */
96 # define DIRENT_MUST_BE(d, t) false
97 # define DIRENT_MIGHT_BE_SYMLINK(d) true
98 # define DIRENT_MIGHT_BE_DIR(d) true
99 #endif /* HAVE_D_TYPE */
101 /* If the system has the `struct dirent64' type we use it internally. */
102 #if defined _LIBC && !defined COMPILE_GLOB64
103 # if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
104 # define CONVERT_D_NAMLEN(d64, d32)
105 # else
106 # define CONVERT_D_NAMLEN(d64, d32) \
107 (d64)->d_namlen = (d32)->d_namlen;
108 # endif
110 # if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
111 # define CONVERT_D_INO(d64, d32)
112 # else
113 # define CONVERT_D_INO(d64, d32) \
114 (d64)->d_ino = (d32)->d_ino;
115 # endif
117 # ifdef _DIRENT_HAVE_D_TYPE
118 # define CONVERT_D_TYPE(d64, d32) \
119 (d64)->d_type = (d32)->d_type;
120 # else
121 # define CONVERT_D_TYPE(d64, d32)
122 # endif
124 # define CONVERT_DIRENT_DIRENT64(d64, d32) \
125 memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1); \
126 CONVERT_D_NAMLEN (d64, d32) \
127 CONVERT_D_INO (d64, d32) \
128 CONVERT_D_TYPE (d64, d32)
129 #endif
132 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
133 /* Posix does not require that the d_ino field be present, and some
134 systems do not provide it. */
135 # define REAL_DIR_ENTRY(dp) 1
136 #else
137 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
138 #endif /* POSIX */
140 #include <stdlib.h>
141 #include <string.h>
143 /* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
144 #include <limits.h>
145 #ifndef NAME_MAX
146 # define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
147 #endif
149 #include <alloca.h>
151 #ifdef _LIBC
152 # undef strdup
153 # define strdup(str) __strdup (str)
154 # define sysconf(id) __sysconf (id)
155 # define closedir(dir) __closedir (dir)
156 # define opendir(name) __opendir (name)
157 # define readdir(str) __readdir64 (str)
158 # define getpwnam_r(name, bufp, buf, len, res) \
159 __getpwnam_r (name, bufp, buf, len, res)
160 # ifndef __stat64
161 # define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
162 # endif
163 # define struct_stat64 struct stat64
164 #else /* !_LIBC */
165 # include "getlogin_r.h"
166 # include "mempcpy.h"
167 # include "stat-macros.h"
168 # include "strdup.h"
169 # define __stat64(fname, buf) stat (fname, buf)
170 # define struct_stat64 struct stat
171 # define __stat(fname, buf) stat (fname, buf)
172 # define __alloca alloca
173 # define __readdir readdir
174 # define __readdir64 readdir64
175 # define __glob_pattern_p glob_pattern_p
176 #endif /* _LIBC */
178 #include <fnmatch.h>
180 #ifdef _SC_GETPW_R_SIZE_MAX
181 # define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
182 #else
183 # define GETPW_R_SIZE_MAX() (-1)
184 #endif
185 #ifdef _SC_LOGIN_NAME_MAX
186 # define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
187 #else
188 # define GET_LOGIN_NAME_MAX() (-1)
189 #endif
191 static const char *next_brace_sub (const char *begin, int flags) __THROW;
193 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
195 static int glob_in_dir (const char *pattern, const char *directory,
196 int flags, int (*errfunc) (const char *, int),
197 glob_t *pglob);
199 #if !defined _LIBC || !defined GLOB_ONLY_P
200 static int prefix_array (const char *prefix, char **array, size_t n) __THROW;
201 static int collated_compare (const void *, const void *) __THROW;
204 /* Find the end of the sub-pattern in a brace expression. */
205 static const char *
206 next_brace_sub (const char *cp, int flags)
208 unsigned int depth = 0;
209 while (*cp != '\0')
210 if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\')
212 if (*++cp == '\0')
213 break;
214 ++cp;
216 else
218 if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
219 break;
221 if (*cp++ == '{')
222 depth++;
225 return *cp != '\0' ? cp : NULL;
228 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
230 /* Do glob searching for PATTERN, placing results in PGLOB.
231 The bits defined above may be set in FLAGS.
232 If a directory cannot be opened or read and ERRFUNC is not nil,
233 it is called with the pathname that caused the error, and the
234 `errno' value from the failing call; if it returns non-zero
235 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
236 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
237 Otherwise, `glob' returns zero. */
239 #ifdef GLOB_ATTRIBUTE
240 GLOB_ATTRIBUTE
241 #endif
242 glob (pattern, flags, errfunc, pglob)
243 const char *pattern;
244 int flags;
245 int (*errfunc) (const char *, int);
246 glob_t *pglob;
248 const char *filename;
249 const char *dirname;
250 size_t dirlen;
251 int status;
252 size_t oldcount;
254 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
256 __set_errno (EINVAL);
257 return -1;
260 if (!(flags & GLOB_DOOFFS))
261 /* Have to do this so `globfree' knows where to start freeing. It
262 also makes all the code that uses gl_offs simpler. */
263 pglob->gl_offs = 0;
265 if (flags & GLOB_BRACE)
267 const char *begin;
269 if (flags & GLOB_NOESCAPE)
270 begin = strchr (pattern, '{');
271 else
273 begin = pattern;
274 while (1)
276 if (*begin == '\0')
278 begin = NULL;
279 break;
282 if (*begin == '\\' && begin[1] != '\0')
283 ++begin;
284 else if (*begin == '{')
285 break;
287 ++begin;
291 if (begin != NULL)
293 /* Allocate working buffer large enough for our work. Note that
294 we have at least an opening and closing brace. */
295 size_t firstc;
296 char *alt_start;
297 const char *p;
298 const char *next;
299 const char *rest;
300 size_t rest_len;
301 #ifdef __GNUC__
302 char onealt[strlen (pattern) - 1];
303 #else
304 char *onealt = (char *) malloc (strlen (pattern) - 1);
305 if (onealt == NULL)
307 if (!(flags & GLOB_APPEND))
309 pglob->gl_pathc = 0;
310 pglob->gl_pathv = NULL;
312 return GLOB_NOSPACE;
314 #endif
316 /* We know the prefix for all sub-patterns. */
317 alt_start = mempcpy (onealt, pattern, begin - pattern);
319 /* Find the first sub-pattern and at the same time find the
320 rest after the closing brace. */
321 next = next_brace_sub (begin + 1, flags);
322 if (next == NULL)
324 /* It is an illegal expression. */
325 #ifndef __GNUC__
326 free (onealt);
327 #endif
328 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
331 /* Now find the end of the whole brace expression. */
332 rest = next;
333 while (*rest != '}')
335 rest = next_brace_sub (rest + 1, flags);
336 if (rest == NULL)
338 /* It is an illegal expression. */
339 #ifndef __GNUC__
340 free (onealt);
341 #endif
342 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
345 /* Please note that we now can be sure the brace expression
346 is well-formed. */
347 rest_len = strlen (++rest) + 1;
349 /* We have a brace expression. BEGIN points to the opening {,
350 NEXT points past the terminator of the first element, and END
351 points past the final }. We will accumulate result names from
352 recursive runs for each brace alternative in the buffer using
353 GLOB_APPEND. */
355 if (!(flags & GLOB_APPEND))
357 /* This call is to set a new vector, so clear out the
358 vector so we can append to it. */
359 pglob->gl_pathc = 0;
360 pglob->gl_pathv = NULL;
362 firstc = pglob->gl_pathc;
364 p = begin + 1;
365 while (1)
367 int result;
369 /* Construct the new glob expression. */
370 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
372 result = glob (onealt,
373 ((flags & ~(GLOB_NOCHECK | GLOB_NOMAGIC))
374 | GLOB_APPEND), errfunc, pglob);
376 /* If we got an error, return it. */
377 if (result && result != GLOB_NOMATCH)
379 #ifndef __GNUC__
380 free (onealt);
381 #endif
382 if (!(flags & GLOB_APPEND))
384 globfree (pglob);
385 pglob->gl_pathc = 0;
387 return result;
390 if (*next == '}')
391 /* We saw the last entry. */
392 break;
394 p = next + 1;
395 next = next_brace_sub (p, flags);
396 assert (next != NULL);
399 #ifndef __GNUC__
400 free (onealt);
401 #endif
403 if (pglob->gl_pathc != firstc)
404 /* We found some entries. */
405 return 0;
406 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
407 return GLOB_NOMATCH;
411 /* Find the filename. */
412 filename = strrchr (pattern, '/');
413 #if defined __MSDOS__ || defined WINDOWS32
414 /* The case of "d:pattern". Since `:' is not allowed in
415 file names, we can safely assume that wherever it
416 happens in pattern, it signals the filename part. This
417 is so we could some day support patterns like "[a-z]:foo". */
418 if (filename == NULL)
419 filename = strchr (pattern, ':');
420 #endif /* __MSDOS__ || WINDOWS32 */
421 if (filename == NULL)
423 /* This can mean two things: a simple name or "~name". The latter
424 case is nothing but a notation for a directory. */
425 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
427 dirname = pattern;
428 dirlen = strlen (pattern);
430 /* Set FILENAME to NULL as a special flag. This is ugly but
431 other solutions would require much more code. We test for
432 this special case below. */
433 filename = NULL;
435 else
437 filename = pattern;
438 #ifdef _AMIGA
439 dirname = "";
440 #else
441 dirname = ".";
442 #endif
443 dirlen = 0;
446 else if (filename == pattern)
448 /* "/pattern". */
449 dirname = "/";
450 dirlen = 1;
451 ++filename;
453 else
455 char *newp;
456 dirlen = filename - pattern;
457 #if defined __MSDOS__ || defined WINDOWS32
458 if (*filename == ':'
459 || (filename > pattern + 1 && filename[-1] == ':'))
461 char *drive_spec;
463 ++dirlen;
464 drive_spec = (char *) __alloca (dirlen + 1);
465 *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
466 /* For now, disallow wildcards in the drive spec, to
467 prevent infinite recursion in glob. */
468 if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
469 return GLOB_NOMATCH;
470 /* If this is "d:pattern", we need to copy `:' to DIRNAME
471 as well. If it's "d:/pattern", don't remove the slash
472 from "d:/", since "d:" and "d:/" are not the same.*/
474 #endif
475 newp = (char *) __alloca (dirlen + 1);
476 *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
477 dirname = newp;
478 ++filename;
480 if (filename[0] == '\0'
481 #if defined __MSDOS__ || defined WINDOWS32
482 && dirname[dirlen - 1] != ':'
483 && (dirlen < 3 || dirname[dirlen - 2] != ':'
484 || dirname[dirlen - 1] != '/')
485 #endif
486 && dirlen > 1)
487 /* "pattern/". Expand "pattern", appending slashes. */
489 int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
490 if (val == 0)
491 pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
492 | (flags & GLOB_MARK));
493 return val;
497 if (!(flags & GLOB_APPEND))
499 pglob->gl_pathc = 0;
500 if (!(flags & GLOB_DOOFFS))
501 pglob->gl_pathv = NULL;
502 else
504 size_t i;
505 pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1)
506 * sizeof (char *));
507 if (pglob->gl_pathv == NULL)
508 return GLOB_NOSPACE;
510 for (i = 0; i <= pglob->gl_offs; ++i)
511 pglob->gl_pathv[i] = NULL;
515 oldcount = pglob->gl_pathc + pglob->gl_offs;
517 #ifndef VMS
518 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
520 if (dirname[1] == '\0' || dirname[1] == '/')
522 /* Look up home directory. */
523 const char *home_dir = getenv ("HOME");
524 # ifdef _AMIGA
525 if (home_dir == NULL || home_dir[0] == '\0')
526 home_dir = "SYS:";
527 # else
528 # ifdef WINDOWS32
529 if (home_dir == NULL || home_dir[0] == '\0')
530 home_dir = "c:/users/default"; /* poor default */
531 # else
532 if (home_dir == NULL || home_dir[0] == '\0')
534 int success;
535 char *name;
536 size_t buflen = GET_LOGIN_NAME_MAX () + 1;
538 if (buflen == 0)
539 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
540 a moderate value. */
541 buflen = 20;
542 name = (char *) __alloca (buflen);
544 success = getlogin_r (name, buflen) == 0;
545 if (success)
547 struct passwd *p;
548 # if defined HAVE_GETPWNAM_R || defined _LIBC
549 long int pwbuflen = GETPW_R_SIZE_MAX ();
550 char *pwtmpbuf;
551 struct passwd pwbuf;
552 int save = errno;
554 # ifndef _LIBC
555 if (pwbuflen == -1)
556 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
557 Try a moderate value. */
558 pwbuflen = 1024;
559 # endif
560 pwtmpbuf = (char *) __alloca (pwbuflen);
562 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
563 != 0)
565 if (errno != ERANGE)
567 p = NULL;
568 break;
570 # ifdef _LIBC
571 pwtmpbuf = extend_alloca (pwtmpbuf, pwbuflen,
572 2 * pwbuflen);
573 # else
574 pwbuflen *= 2;
575 pwtmpbuf = (char *) __alloca (pwbuflen);
576 # endif
577 __set_errno (save);
579 # else
580 p = getpwnam (name);
581 # endif
582 if (p != NULL)
583 home_dir = p->pw_dir;
586 if (home_dir == NULL || home_dir[0] == '\0')
588 if (flags & GLOB_TILDE_CHECK)
589 return GLOB_NOMATCH;
590 else
591 home_dir = "~"; /* No luck. */
593 # endif /* WINDOWS32 */
594 # endif
595 /* Now construct the full directory. */
596 if (dirname[1] == '\0')
597 dirname = home_dir;
598 else
600 char *newp;
601 size_t home_len = strlen (home_dir);
602 newp = (char *) __alloca (home_len + dirlen);
603 mempcpy (mempcpy (newp, home_dir, home_len),
604 &dirname[1], dirlen);
605 dirname = newp;
608 # if !defined _AMIGA && !defined WINDOWS32
609 else
611 char *end_name = strchr (dirname, '/');
612 const char *user_name;
613 const char *home_dir;
615 if (end_name == NULL)
616 user_name = dirname + 1;
617 else
619 char *newp;
620 newp = (char *) __alloca (end_name - dirname);
621 *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
622 = '\0';
623 user_name = newp;
626 /* Look up specific user's home directory. */
628 struct passwd *p;
629 # if defined HAVE_GETPWNAM_R || defined _LIBC
630 long int buflen = GETPW_R_SIZE_MAX ();
631 char *pwtmpbuf;
632 struct passwd pwbuf;
633 int save = errno;
635 # ifndef _LIBC
636 if (buflen == -1)
637 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
638 moderate value. */
639 buflen = 1024;
640 # endif
641 pwtmpbuf = (char *) __alloca (buflen);
643 while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
645 if (errno != ERANGE)
647 p = NULL;
648 break;
650 # ifdef _LIBC
651 pwtmpbuf = extend_alloca (pwtmpbuf, buflen, 2 * buflen);
652 # else
653 buflen *= 2;
654 pwtmpbuf = __alloca (buflen);
655 # endif
656 __set_errno (save);
658 # else
659 p = getpwnam (user_name);
660 # endif
661 if (p != NULL)
662 home_dir = p->pw_dir;
663 else
664 home_dir = NULL;
666 /* If we found a home directory use this. */
667 if (home_dir != NULL)
669 char *newp;
670 size_t home_len = strlen (home_dir);
671 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
672 newp = (char *) __alloca (home_len + rest_len + 1);
673 *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
674 end_name, rest_len)) = '\0';
675 dirname = newp;
677 else
678 if (flags & GLOB_TILDE_CHECK)
679 /* We have to regard it as an error if we cannot find the
680 home directory. */
681 return GLOB_NOMATCH;
683 # endif /* Not Amiga && not WINDOWS32. */
685 #endif /* Not VMS. */
687 /* Now test whether we looked for "~" or "~NAME". In this case we
688 can give the answer now. */
689 if (filename == NULL)
691 struct stat st;
692 struct_stat64 st64;
694 /* Return the directory if we don't check for error or if it exists. */
695 if ((flags & GLOB_NOCHECK)
696 || (((flags & GLOB_ALTDIRFUNC)
697 ? ((*pglob->gl_stat) (dirname, &st) == 0
698 && S_ISDIR (st.st_mode))
699 : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
701 int newcount = pglob->gl_pathc + pglob->gl_offs;
702 char **new_gl_pathv;
704 new_gl_pathv
705 = (char **) realloc (pglob->gl_pathv,
706 (newcount + 1 + 1) * sizeof (char *));
707 if (new_gl_pathv == NULL)
709 nospace:
710 free (pglob->gl_pathv);
711 pglob->gl_pathv = NULL;
712 pglob->gl_pathc = 0;
713 return GLOB_NOSPACE;
715 pglob->gl_pathv = new_gl_pathv;
717 pglob->gl_pathv[newcount] = strdup (dirname);
718 if (pglob->gl_pathv[newcount] == NULL)
719 goto nospace;
720 pglob->gl_pathv[++newcount] = NULL;
721 ++pglob->gl_pathc;
722 pglob->gl_flags = flags;
724 return 0;
727 /* Not found. */
728 return GLOB_NOMATCH;
731 if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
733 /* The directory name contains metacharacters, so we
734 have to glob for the directory, and then glob for
735 the pattern in each directory found. */
736 glob_t dirs;
737 size_t i;
739 if ((flags & GLOB_ALTDIRFUNC) != 0)
741 /* Use the alternative access functions also in the recursive
742 call. */
743 dirs.gl_opendir = pglob->gl_opendir;
744 dirs.gl_readdir = pglob->gl_readdir;
745 dirs.gl_closedir = pglob->gl_closedir;
746 dirs.gl_stat = pglob->gl_stat;
747 dirs.gl_lstat = pglob->gl_lstat;
750 status = glob (dirname,
751 ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE
752 | GLOB_ALTDIRFUNC))
753 | GLOB_NOSORT | GLOB_ONLYDIR),
754 errfunc, &dirs);
755 if (status != 0)
756 return status;
758 /* We have successfully globbed the preceding directory name.
759 For each name we found, call glob_in_dir on it and FILENAME,
760 appending the results to PGLOB. */
761 for (i = 0; i < dirs.gl_pathc; ++i)
763 int old_pathc;
765 #ifdef SHELL
767 /* Make globbing interruptible in the bash shell. */
768 extern int interrupt_state;
770 if (interrupt_state)
772 globfree (&dirs);
773 return GLOB_ABORTED;
776 #endif /* SHELL. */
778 old_pathc = pglob->gl_pathc;
779 status = glob_in_dir (filename, dirs.gl_pathv[i],
780 ((flags | GLOB_APPEND)
781 & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
782 errfunc, pglob);
783 if (status == GLOB_NOMATCH)
784 /* No matches in this directory. Try the next. */
785 continue;
787 if (status != 0)
789 globfree (&dirs);
790 globfree (pglob);
791 pglob->gl_pathc = 0;
792 return status;
795 /* Stick the directory on the front of each name. */
796 if (prefix_array (dirs.gl_pathv[i],
797 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
798 pglob->gl_pathc - old_pathc))
800 globfree (&dirs);
801 globfree (pglob);
802 pglob->gl_pathc = 0;
803 return GLOB_NOSPACE;
807 flags |= GLOB_MAGCHAR;
809 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
810 But if we have not found any matching entry and the GLOB_NOCHECK
811 flag was set we must return the input pattern itself. */
812 if (pglob->gl_pathc + pglob->gl_offs == oldcount)
814 /* No matches. */
815 if (flags & GLOB_NOCHECK)
817 int newcount = pglob->gl_pathc + pglob->gl_offs;
818 char **new_gl_pathv;
820 new_gl_pathv = (char **) realloc (pglob->gl_pathv,
821 (newcount + 2)
822 * sizeof (char *));
823 if (new_gl_pathv == NULL)
825 globfree (&dirs);
826 return GLOB_NOSPACE;
828 pglob->gl_pathv = new_gl_pathv;
830 pglob->gl_pathv[newcount] = __strdup (pattern);
831 if (pglob->gl_pathv[newcount] == NULL)
833 globfree (&dirs);
834 globfree (pglob);
835 pglob->gl_pathc = 0;
836 return GLOB_NOSPACE;
839 ++pglob->gl_pathc;
840 ++newcount;
842 pglob->gl_pathv[newcount] = NULL;
843 pglob->gl_flags = flags;
845 else
847 globfree (&dirs);
848 return GLOB_NOMATCH;
852 globfree (&dirs);
854 else
856 int old_pathc = pglob->gl_pathc;
858 status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
859 if (status != 0)
860 return status;
862 if (dirlen > 0)
864 /* Stick the directory on the front of each name. */
865 if (prefix_array (dirname,
866 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
867 pglob->gl_pathc - old_pathc))
869 globfree (pglob);
870 pglob->gl_pathc = 0;
871 return GLOB_NOSPACE;
876 if (flags & GLOB_MARK)
878 /* Append slashes to directory names. */
879 size_t i;
880 struct stat st;
881 struct_stat64 st64;
883 for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
884 if (((flags & GLOB_ALTDIRFUNC)
885 ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
886 && S_ISDIR (st.st_mode))
887 : (__stat64 (pglob->gl_pathv[i], &st64) == 0
888 && S_ISDIR (st64.st_mode))))
890 size_t len = strlen (pglob->gl_pathv[i]) + 2;
891 char *new = realloc (pglob->gl_pathv[i], len);
892 if (new == NULL)
894 globfree (pglob);
895 pglob->gl_pathc = 0;
896 return GLOB_NOSPACE;
898 strcpy (&new[len - 2], "/");
899 pglob->gl_pathv[i] = new;
903 if (!(flags & GLOB_NOSORT))
905 /* Sort the vector. */
906 qsort (&pglob->gl_pathv[oldcount],
907 pglob->gl_pathc + pglob->gl_offs - oldcount,
908 sizeof (char *), collated_compare);
911 return 0;
913 #if defined _LIBC && !defined glob
914 libc_hidden_def (glob)
915 #endif
918 #if !defined _LIBC || !defined GLOB_ONLY_P
920 /* Free storage allocated in PGLOB by a previous `glob' call. */
921 void
922 globfree (pglob)
923 register glob_t *pglob;
925 if (pglob->gl_pathv != NULL)
927 size_t i;
928 for (i = 0; i < pglob->gl_pathc; ++i)
929 if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
930 free (pglob->gl_pathv[pglob->gl_offs + i]);
931 free (pglob->gl_pathv);
932 pglob->gl_pathv = NULL;
935 #if defined _LIBC && !defined globfree
936 libc_hidden_def (globfree)
937 #endif
940 /* Do a collated comparison of A and B. */
941 static int
942 collated_compare (const void *a, const void *b)
944 const char *const s1 = *(const char *const * const) a;
945 const char *const s2 = *(const char *const * const) b;
947 if (s1 == s2)
948 return 0;
949 if (s1 == NULL)
950 return 1;
951 if (s2 == NULL)
952 return -1;
953 return strcoll (s1, s2);
957 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
958 elements in place. Return nonzero if out of memory, zero if successful.
959 A slash is inserted between DIRNAME and each elt of ARRAY,
960 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
961 static int
962 prefix_array (const char *dirname, char **array, size_t n)
964 register size_t i;
965 size_t dirlen = strlen (dirname);
966 #if defined __MSDOS__ || defined WINDOWS32
967 int sep_char = '/';
968 # define DIRSEP_CHAR sep_char
969 #else
970 # define DIRSEP_CHAR '/'
971 #endif
973 if (dirlen == 1 && dirname[0] == '/')
974 /* DIRNAME is just "/", so normal prepending would get us "//foo".
975 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
976 dirlen = 0;
977 #if defined __MSDOS__ || defined WINDOWS32
978 else if (dirlen > 1)
980 if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
981 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
982 --dirlen;
983 else if (dirname[dirlen - 1] == ':')
985 /* DIRNAME is "d:". Use `:' instead of `/'. */
986 --dirlen;
987 sep_char = ':';
990 #endif
992 for (i = 0; i < n; ++i)
994 size_t eltlen = strlen (array[i]) + 1;
995 char *new = (char *) malloc (dirlen + 1 + eltlen);
996 if (new == NULL)
998 while (i > 0)
999 free (array[--i]);
1000 return 1;
1004 char *endp = mempcpy (new, dirname, dirlen);
1005 *endp++ = DIRSEP_CHAR;
1006 mempcpy (endp, array[i], eltlen);
1008 free (array[i]);
1009 array[i] = new;
1012 return 0;
1016 /* We must not compile this function twice. */
1017 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1018 /* Return nonzero if PATTERN contains any metacharacters.
1019 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1021 __glob_pattern_p (pattern, quote)
1022 const char *pattern;
1023 int quote;
1025 register const char *p;
1026 int open = 0;
1028 for (p = pattern; *p != '\0'; ++p)
1029 switch (*p)
1031 case '?':
1032 case '*':
1033 return 1;
1035 case '\\':
1036 if (quote && p[1] != '\0')
1037 ++p;
1038 break;
1040 case '[':
1041 open = 1;
1042 break;
1044 case ']':
1045 if (open)
1046 return 1;
1047 break;
1050 return 0;
1052 # ifdef _LIBC
1053 weak_alias (__glob_pattern_p, glob_pattern_p)
1054 # endif
1055 #endif
1057 #endif /* !GLOB_ONLY_P */
1060 /* We put this in a separate function mainly to allow the memory
1061 allocated with alloca to be recycled. */
1062 #if !defined _LIBC || !defined GLOB_ONLY_P
1063 static int
1064 link_exists_p (const char *dir, size_t dirlen, const char *fname,
1065 glob_t *pglob, int flags)
1067 size_t fnamelen = strlen (fname);
1068 char *fullname = (char *) __alloca (dirlen + 1 + fnamelen + 1);
1069 struct stat st;
1070 struct_stat64 st64;
1072 mempcpy (mempcpy (mempcpy (fullname, dir, dirlen), "/", 1),
1073 fname, fnamelen + 1);
1075 return (((flags & GLOB_ALTDIRFUNC)
1076 ? (*pglob->gl_stat) (fullname, &st)
1077 : __stat64 (fullname, &st64)) == 0);
1079 #endif
1082 /* Like `glob', but PATTERN is a final pathname component,
1083 and matches are searched for in DIRECTORY.
1084 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1085 The GLOB_APPEND flag is assumed to be set (always appends). */
1086 static int
1087 glob_in_dir (const char *pattern, const char *directory, int flags,
1088 int (*errfunc) (const char *, int),
1089 glob_t *pglob)
1091 size_t dirlen = strlen (directory);
1092 void *stream = NULL;
1093 struct globlink
1095 struct globlink *next;
1096 char *name;
1098 struct globlink *names = NULL;
1099 size_t nfound;
1100 int meta;
1101 int save;
1103 meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
1104 if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
1106 /* We need not do any tests. The PATTERN contains no meta
1107 characters and we must not return an error therefore the
1108 result will always contain exactly one name. */
1109 flags |= GLOB_NOCHECK;
1110 nfound = 0;
1112 else if (meta == 0 &&
1113 ((flags & GLOB_NOESCAPE) || strchr (pattern, '\\') == NULL))
1115 /* Since we use the normal file functions we can also use stat()
1116 to verify the file is there. */
1117 struct stat st;
1118 struct_stat64 st64;
1119 size_t patlen = strlen (pattern);
1120 char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
1122 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
1123 "/", 1),
1124 pattern, patlen + 1);
1125 if (((flags & GLOB_ALTDIRFUNC)
1126 ? (*pglob->gl_stat) (fullname, &st)
1127 : __stat64 (fullname, &st64)) == 0)
1128 /* We found this file to be existing. Now tell the rest
1129 of the function to copy this name into the result. */
1130 flags |= GLOB_NOCHECK;
1132 nfound = 0;
1134 else
1136 if (pattern[0] == '\0')
1138 /* This is a special case for matching directories like in
1139 "*a/". */
1140 names = (struct globlink *) __alloca (sizeof (struct globlink));
1141 names->name = (char *) malloc (1);
1142 if (names->name == NULL)
1143 goto memory_error;
1144 names->name[0] = '\0';
1145 names->next = NULL;
1146 nfound = 1;
1147 meta = 0;
1149 else
1151 stream = ((flags & GLOB_ALTDIRFUNC)
1152 ? (*pglob->gl_opendir) (directory)
1153 : opendir (directory));
1154 if (stream == NULL)
1156 if (errno != ENOTDIR
1157 && ((errfunc != NULL && (*errfunc) (directory, errno))
1158 || (flags & GLOB_ERR)))
1159 return GLOB_ABORTED;
1160 nfound = 0;
1161 meta = 0;
1163 else
1165 int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
1166 | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
1167 #if defined _AMIGA || defined VMS
1168 | FNM_CASEFOLD
1169 #endif
1171 nfound = 0;
1172 flags |= GLOB_MAGCHAR;
1174 while (1)
1176 const char *name;
1177 size_t len;
1178 #if defined _LIBC && !defined COMPILE_GLOB64
1179 struct dirent64 *d;
1180 union
1182 struct dirent64 d64;
1183 char room [offsetof (struct dirent64, d_name[0])
1184 + NAME_MAX + 1];
1186 d64buf;
1188 if (flags & GLOB_ALTDIRFUNC)
1190 struct dirent *d32 = (*pglob->gl_readdir) (stream);
1191 if (d32 != NULL)
1193 CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
1194 d = &d64buf.d64;
1196 else
1197 d = NULL;
1199 else
1200 d = __readdir64 (stream);
1201 #else
1202 struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
1203 ? ((struct dirent *)
1204 (*pglob->gl_readdir) (stream))
1205 : __readdir (stream));
1206 #endif
1207 if (d == NULL)
1208 break;
1209 if (! REAL_DIR_ENTRY (d))
1210 continue;
1212 /* If we shall match only directories use the information
1213 provided by the dirent call if possible. */
1214 if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d))
1215 continue;
1217 name = d->d_name;
1219 if (fnmatch (pattern, name, fnm_flags) == 0)
1221 /* If the file we found is a symlink we have to
1222 make sure the target file exists. */
1223 if (!DIRENT_MIGHT_BE_SYMLINK (d)
1224 || link_exists_p (directory, dirlen, name, pglob,
1225 flags))
1227 struct globlink *new = (struct globlink *)
1228 __alloca (sizeof (struct globlink));
1229 len = NAMLEN (d);
1230 new->name = (char *) malloc (len + 1);
1231 if (new->name == NULL)
1232 goto memory_error;
1233 *((char *) mempcpy (new->name, name, len)) = '\0';
1234 new->next = names;
1235 names = new;
1236 ++nfound;
1244 if (nfound == 0 && (flags & GLOB_NOCHECK))
1246 size_t len = strlen (pattern);
1247 nfound = 1;
1248 names = (struct globlink *) __alloca (sizeof (struct globlink));
1249 names->next = NULL;
1250 names->name = (char *) malloc (len + 1);
1251 if (names->name == NULL)
1252 goto memory_error;
1253 *((char *) mempcpy (names->name, pattern, len)) = '\0';
1256 if (nfound != 0)
1258 char **new_gl_pathv;
1260 new_gl_pathv
1261 = (char **) realloc (pglob->gl_pathv,
1262 (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
1263 * sizeof (char *));
1264 if (new_gl_pathv == NULL)
1265 goto memory_error;
1266 pglob->gl_pathv = new_gl_pathv;
1268 for (; names != NULL; names = names->next)
1269 pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc++] = names->name;
1270 pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
1272 pglob->gl_flags = flags;
1275 save = errno;
1276 if (stream != NULL)
1278 if (flags & GLOB_ALTDIRFUNC)
1279 (*pglob->gl_closedir) (stream);
1280 else
1281 closedir (stream);
1283 __set_errno (save);
1285 return nfound == 0 ? GLOB_NOMATCH : 0;
1287 memory_error:
1289 int save = errno;
1290 if (flags & GLOB_ALTDIRFUNC)
1291 (*pglob->gl_closedir) (stream);
1292 else
1293 closedir (stream);
1294 __set_errno (save);
1296 while (names != NULL)
1298 if (names->name != NULL)
1299 free (names->name);
1300 names = names->next;
1302 return GLOB_NOSPACE;