annotate lib/glob.c @ 11938:7cbcde229d97

backupfile, chdir-long, fts, savedir: make safer * lib/backupfile.c (includes): Use "dirent--.h", since numbered_backup can write to stderr during readdir. * lib/savedir.c (includes): Likewise. * lib/chdir-long.c (includes): Use "fcntl--.h", since openat emulation can write to stderr on failure. * lib/fts.c (includes) [!_LIBC]: Likewise for opendir and openat. * lib/getcwd.c: Document why opendir_safer is unused. * lib/glob.c: Likewise. * lib/scandir.c: Likewise. * lib/openat-proc.c: Likewise, for open_safer. * modules/backupfile (Depends-on): Add dirent-safer. * modules/savedir (Depends-on): Likewise. * modules/fts (Depends-on): Add dirent-safer and openat-safer. * modules/chdir-long (Depends-on): Add openat-safer. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Tue, 01 Sep 2009 12:25:01 -0600
parents 2b0380d48ff6
children f295924fa612
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11938
7cbcde229d97 backupfile, chdir-long, fts, savedir: make safer
Eric Blake <ebb9@byu.net>
parents: 10663
diff changeset
1 /* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
2 Free Software Foundation, Inc.
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
3 This file is part of the GNU C Library.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
4
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
5 The GNU C Library is free software; you can redistribute it and/or
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
6 modify it under the terms of the GNU Lesser General Public
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
7 License as published by the Free Software Foundation; either
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
8 version 2.1 of the License, or (at your option) any later version.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
9
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
10 The GNU C Library is distributed in the hope that it will be useful,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
13 Lesser General Public License for more details.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
14
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
15 You should have received a copy of the GNU Lesser General Public
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
16 License along with the GNU C Library; if not, write to the Free
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
18 02111-1307 USA. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
19
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6954
diff changeset
20 #ifndef _LIBC
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
21 # include <config.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
22 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
23
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
24 #include <glob.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
25
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
26 #include <errno.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
27 #include <sys/types.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
28 #include <sys/stat.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
29 #include <stddef.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
30
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
31 /* Outcomment the following line for production quality code. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
32 /* #define NDEBUG 1 */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
33 #include <assert.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
34
9892
0b3ccf361045 Include stdbool, for 'true' and 'false'.
Bruno Haible <bruno@clisp.org>
parents: 9557
diff changeset
35 #include <stdbool.h>
0b3ccf361045 Include stdbool, for 'true' and 'false'.
Bruno Haible <bruno@clisp.org>
parents: 9557
diff changeset
36
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
37 #include <stdio.h> /* Needed on stupid SunOS for assert. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
38
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
39 #if !defined _LIBC || !defined GLOB_ONLY_P
6689
93d578c7aa44 * lib/c-stack.c: Include unistd.h unconditionally, since we now assume
Paul Eggert <eggert@cs.ucla.edu>
parents: 6655
diff changeset
40
93d578c7aa44 * lib/c-stack.c: Include unistd.h unconditionally, since we now assume
Paul Eggert <eggert@cs.ucla.edu>
parents: 6655
diff changeset
41 #include <unistd.h>
93d578c7aa44 * lib/c-stack.c: Include unistd.h unconditionally, since we now assume
Paul Eggert <eggert@cs.ucla.edu>
parents: 6655
diff changeset
42 #if !defined POSIX && defined _POSIX_VERSION
93d578c7aa44 * lib/c-stack.c: Include unistd.h unconditionally, since we now assume
Paul Eggert <eggert@cs.ucla.edu>
parents: 6655
diff changeset
43 # define POSIX
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
44 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
45
10423
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
46 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
47 # define WINDOWS32
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
48 #endif
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
49
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
50 #ifndef WINDOWS32
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
51 # include <pwd.h>
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
52 #endif
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
53
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
54 #include <errno.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
55 #ifndef __set_errno
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
56 # define __set_errno(val) errno = (val)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
57 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
58
6949
96af1224c6fa * backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Paul Eggert <eggert@cs.ucla.edu>
parents: 6934
diff changeset
59 #include <dirent.h>
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
60
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
61
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
62 /* In GNU systems, <dirent.h> defines this macro for us. */
6949
96af1224c6fa * backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Paul Eggert <eggert@cs.ucla.edu>
parents: 6934
diff changeset
63 #ifndef _D_EXACT_NAMLEN
96af1224c6fa * backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Paul Eggert <eggert@cs.ucla.edu>
parents: 6934
diff changeset
64 # define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
65 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
66
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
67 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
68 if the `d_type' member for `struct dirent' is available.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
69 HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
70 #if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
71 /* True if the directory entry D must be of type T. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
72 # define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
73
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
74 /* True if the directory entry D might be a symbolic link. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
75 # define DIRENT_MIGHT_BE_SYMLINK(d) \
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
76 ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
77
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
78 /* True if the directory entry D might be a directory. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
79 # define DIRENT_MIGHT_BE_DIR(d) \
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
80 ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
81
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
82 #else /* !HAVE_D_TYPE */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
83 # define DIRENT_MUST_BE(d, t) false
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
84 # define DIRENT_MIGHT_BE_SYMLINK(d) true
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
85 # define DIRENT_MIGHT_BE_DIR(d) true
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
86 #endif /* HAVE_D_TYPE */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
87
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
88 /* If the system has the `struct dirent64' type we use it internally. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
89 #if defined _LIBC && !defined COMPILE_GLOB64
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
90 # if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
91 # define CONVERT_D_INO(d64, d32)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
92 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
93 # define CONVERT_D_INO(d64, d32) \
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
94 (d64)->d_ino = (d32)->d_ino;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
95 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
96
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
97 # ifdef _DIRENT_HAVE_D_TYPE
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
98 # define CONVERT_D_TYPE(d64, d32) \
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
99 (d64)->d_type = (d32)->d_type;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
100 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
101 # define CONVERT_D_TYPE(d64, d32)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
102 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
103
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
104 # define CONVERT_DIRENT_DIRENT64(d64, d32) \
6954
f9276a8d45a7 * glob.c: s/NAMLEN/_D_EXACT_NAMLEN/.
Derek R. Price <derek@ximbiot.com>
parents: 6949
diff changeset
105 memcpy ((d64)->d_name, (d32)->d_name, _D_EXACT_NAMLEN (d32) + 1); \
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
106 CONVERT_D_INO (d64, d32) \
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
107 CONVERT_D_TYPE (d64, d32)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
108 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
109
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
110
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
111 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
112 /* Posix does not require that the d_ino field be present, and some
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
113 systems do not provide it. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
114 # define REAL_DIR_ENTRY(dp) 1
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
115 #else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
116 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
117 #endif /* POSIX */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
118
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
119 #include <stdlib.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
120 #include <string.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
121
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
122 /* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
123 #include <limits.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
124 #ifndef NAME_MAX
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
125 # define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
126 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
127
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
128 #include <alloca.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
129
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
130 #ifdef _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
131 # undef strdup
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
132 # define strdup(str) __strdup (str)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
133 # define sysconf(id) __sysconf (id)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
134 # define closedir(dir) __closedir (dir)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
135 # define opendir(name) __opendir (name)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
136 # define readdir(str) __readdir64 (str)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
137 # define getpwnam_r(name, bufp, buf, len, res) \
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
138 __getpwnam_r (name, bufp, buf, len, res)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
139 # ifndef __stat64
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
140 # define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
141 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
142 # define struct_stat64 struct stat64
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
143 #else /* !_LIBC */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
144 # define __stat64(fname, buf) stat (fname, buf)
9357
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
145 # define __fxstatat64(_, d, f, st, flag) fstatat (d, f, st, flag)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
146 # define struct_stat64 struct stat
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
147 # define __stat(fname, buf) stat (fname, buf)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
148 # define __alloca alloca
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
149 # define __readdir readdir
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
150 # define __readdir64 readdir64
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
151 # define __glob_pattern_p glob_pattern_p
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
152 #endif /* _LIBC */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
153
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
154 #include <fnmatch.h>
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
155
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
156 #ifdef _SC_GETPW_R_SIZE_MAX
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
157 # define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
158 #else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
159 # define GETPW_R_SIZE_MAX() (-1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
160 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
161 #ifdef _SC_LOGIN_NAME_MAX
6198
4270667abdee * lib/glob.c (GET_LOGIN_NAME_MAX): Renamed from LOGIN_NAME_MAX,
Paul Eggert <eggert@cs.ucla.edu>
parents: 5898
diff changeset
162 # define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
163 #else
6198
4270667abdee * lib/glob.c (GET_LOGIN_NAME_MAX): Renamed from LOGIN_NAME_MAX,
Paul Eggert <eggert@cs.ucla.edu>
parents: 5898
diff changeset
164 # define GET_LOGIN_NAME_MAX() (-1)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
165 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
166
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
167 static const char *next_brace_sub (const char *begin, int flags) __THROW;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
168
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
169 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
170
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
171 #ifndef attribute_hidden
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
172 # define attribute_hidden
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
173 #endif
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
174
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
175 #ifndef __attribute_noinline__
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
176 # if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
177 # define __attribute_noinline__ /* Ignore */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
178 #else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
179 # define __attribute_noinline__ __attribute__ ((__noinline__))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
180 # endif
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
181 #endif
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
182
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
183 #if ! defined __builtin_expect && __GNUC__ < 3
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
184 # define __builtin_expect(expr, expected) (expr)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
185 #endif
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
186
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
187 #ifndef _LIBC
7863
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7581
diff changeset
188 /* The results of opendir() in this file are not used with dirfd and fchdir,
11938
7cbcde229d97 backupfile, chdir-long, fts, savedir: make safer
Eric Blake <ebb9@byu.net>
parents: 10663
diff changeset
189 and we do not leak fds to any single-threaded code that could use stdio,
7cbcde229d97 backupfile, chdir-long, fts, savedir: make safer
Eric Blake <ebb9@byu.net>
parents: 10663
diff changeset
190 therefore save some unnecessary recursion in fchdir.c and opendir_safer.c.
7cbcde229d97 backupfile, chdir-long, fts, savedir: make safer
Eric Blake <ebb9@byu.net>
parents: 10663
diff changeset
191 FIXME - if the kernel ever adds support for multi-thread safety for
7cbcde229d97 backupfile, chdir-long, fts, savedir: make safer
Eric Blake <ebb9@byu.net>
parents: 10663
diff changeset
192 avoiding standard fds, then we should use opendir_safer. */
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
193 # undef opendir
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
194 # undef closedir
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
195
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
196 # if HAVE_ALLOCA
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
197 /* The OS usually guarantees only one guard page at the bottom of the stack,
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
198 and a page size can be as small as 4096 bytes. So we cannot safely
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
199 allocate anything larger than 4096 bytes. Also care for the possibility
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
200 of a few compiler-allocated temporary stack slots. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
201 # define __libc_use_alloca(n) ((n) < 4032)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
202 # else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
203 /* alloca is implemented with malloc, so just use malloc. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
204 # define __libc_use_alloca(n) 0
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
205 # endif
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
206 #endif
7863
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7581
diff changeset
207
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
208 static int glob_in_dir (const char *pattern, const char *directory,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
209 int flags, int (*errfunc) (const char *, int),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
210 glob_t *pglob);
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
211 extern int __glob_pattern_type (const char *pattern, int quote)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
212 attribute_hidden;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
213
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
214 #if !defined _LIBC || !defined GLOB_ONLY_P
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
215 static int prefix_array (const char *prefix, char **array, size_t n) __THROW;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
216 static int collated_compare (const void *, const void *) __THROW;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
217
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
218
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
219 /* Find the end of the sub-pattern in a brace expression. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
220 static const char *
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
221 next_brace_sub (const char *cp, int flags)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
222 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
223 unsigned int depth = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
224 while (*cp != '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
225 if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
226 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
227 if (*++cp == '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
228 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
229 ++cp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
230 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
231 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
232 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
233 if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
234 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
235
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
236 if (*cp++ == '{')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
237 depth++;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
238 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
239
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
240 return *cp != '\0' ? cp : NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
241 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
242
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
243 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
244
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
245 /* Do glob searching for PATTERN, placing results in PGLOB.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
246 The bits defined above may be set in FLAGS.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
247 If a directory cannot be opened or read and ERRFUNC is not nil,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
248 it is called with the pathname that caused the error, and the
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
249 `errno' value from the failing call; if it returns non-zero
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
250 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
251 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
252 Otherwise, `glob' returns zero. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
253 int
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
254 #ifdef GLOB_ATTRIBUTE
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
255 GLOB_ATTRIBUTE
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
256 #endif
6218
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
257 glob (pattern, flags, errfunc, pglob)
8439
d8182f376307 2007-03-15 Bruno Haible <bruno@clisp.org>
Bruno Haible <bruno@clisp.org>
parents: 8222
diff changeset
258 const char * restrict pattern;
6218
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
259 int flags;
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
260 int (*errfunc) (const char *, int);
8439
d8182f376307 2007-03-15 Bruno Haible <bruno@clisp.org>
Bruno Haible <bruno@clisp.org>
parents: 8222
diff changeset
261 glob_t * restrict pglob;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
262 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
263 const char *filename;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
264 const char *dirname;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
265 size_t dirlen;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
266 int status;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
267 size_t oldcount;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
268 int meta;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
269 int dirname_modified;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
270 glob_t dirs;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
271
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
272 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
273 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
274 __set_errno (EINVAL);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
275 return -1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
276 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
277
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
278 if (!(flags & GLOB_DOOFFS))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
279 /* Have to do this so `globfree' knows where to start freeing. It
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
280 also makes all the code that uses gl_offs simpler. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
281 pglob->gl_offs = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
282
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
283 if (flags & GLOB_BRACE)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
284 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
285 const char *begin;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
286
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
287 if (flags & GLOB_NOESCAPE)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
288 begin = strchr (pattern, '{');
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
289 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
290 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
291 begin = pattern;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
292 while (1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
293 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
294 if (*begin == '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
295 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
296 begin = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
297 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
298 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
299
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
300 if (*begin == '\\' && begin[1] != '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
301 ++begin;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
302 else if (*begin == '{')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
303 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
304
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
305 ++begin;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
306 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
307 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
308
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
309 if (begin != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
310 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
311 /* Allocate working buffer large enough for our work. Note that
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
312 we have at least an opening and closing brace. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
313 size_t firstc;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
314 char *alt_start;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
315 const char *p;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
316 const char *next;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
317 const char *rest;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
318 size_t rest_len;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
319 #ifdef __GNUC__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
320 char onealt[strlen (pattern) - 1];
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
321 #else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
322 char *onealt = malloc (strlen (pattern) - 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
323 if (onealt == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
324 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
325 if (!(flags & GLOB_APPEND))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
326 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
327 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
328 pglob->gl_pathv = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
329 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
330 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
331 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
332 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
333
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
334 /* We know the prefix for all sub-patterns. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
335 alt_start = mempcpy (onealt, pattern, begin - pattern);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
336
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
337 /* Find the first sub-pattern and at the same time find the
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
338 rest after the closing brace. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
339 next = next_brace_sub (begin + 1, flags);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
340 if (next == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
341 {
6655
24fed12ac0b5 illegal -> invalid
Paul Eggert <eggert@cs.ucla.edu>
parents: 6218
diff changeset
342 /* It is an invalid expression. */
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
343 #ifndef __GNUC__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
344 free (onealt);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
345 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
346 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
347 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
348
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
349 /* Now find the end of the whole brace expression. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
350 rest = next;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
351 while (*rest != '}')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
352 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
353 rest = next_brace_sub (rest + 1, flags);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
354 if (rest == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
355 {
6655
24fed12ac0b5 illegal -> invalid
Paul Eggert <eggert@cs.ucla.edu>
parents: 6218
diff changeset
356 /* It is an invalid expression. */
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
357 #ifndef __GNUC__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
358 free (onealt);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
359 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
360 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
361 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
362 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
363 /* Please note that we now can be sure the brace expression
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
364 is well-formed. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
365 rest_len = strlen (++rest) + 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
366
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
367 /* We have a brace expression. BEGIN points to the opening {,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
368 NEXT points past the terminator of the first element, and END
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
369 points past the final }. We will accumulate result names from
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
370 recursive runs for each brace alternative in the buffer using
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
371 GLOB_APPEND. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
372
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
373 if (!(flags & GLOB_APPEND))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
374 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
375 /* This call is to set a new vector, so clear out the
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
376 vector so we can append to it. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
377 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
378 pglob->gl_pathv = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
379 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
380 firstc = pglob->gl_pathc;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
381
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
382 p = begin + 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
383 while (1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
384 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
385 int result;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
386
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
387 /* Construct the new glob expression. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
388 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
389
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
390 result = glob (onealt,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
391 ((flags & ~(GLOB_NOCHECK | GLOB_NOMAGIC))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
392 | GLOB_APPEND), errfunc, pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
393
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
394 /* If we got an error, return it. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
395 if (result && result != GLOB_NOMATCH)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
396 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
397 #ifndef __GNUC__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
398 free (onealt);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
399 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
400 if (!(flags & GLOB_APPEND))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
401 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
402 globfree (pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
403 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
404 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
405 return result;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
406 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
407
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
408 if (*next == '}')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
409 /* We saw the last entry. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
410 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
411
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
412 p = next + 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
413 next = next_brace_sub (p, flags);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
414 assert (next != NULL);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
415 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
416
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
417 #ifndef __GNUC__
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
418 free (onealt);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
419 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
420
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
421 if (pglob->gl_pathc != firstc)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
422 /* We found some entries. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
423 return 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
424 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
425 return GLOB_NOMATCH;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
426 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
427 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
428
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
429 /* Find the filename. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
430 filename = strrchr (pattern, '/');
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
431 #if defined __MSDOS__ || defined WINDOWS32
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
432 /* The case of "d:pattern". Since `:' is not allowed in
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
433 file names, we can safely assume that wherever it
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
434 happens in pattern, it signals the filename part. This
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
435 is so we could some day support patterns like "[a-z]:foo". */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
436 if (filename == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
437 filename = strchr (pattern, ':');
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
438 #endif /* __MSDOS__ || WINDOWS32 */
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
439 dirname_modified = 0;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
440 if (filename == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
441 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
442 /* This can mean two things: a simple name or "~name". The latter
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
443 case is nothing but a notation for a directory. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
444 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
445 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
446 dirname = pattern;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
447 dirlen = strlen (pattern);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
448
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
449 /* Set FILENAME to NULL as a special flag. This is ugly but
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
450 other solutions would require much more code. We test for
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
451 this special case below. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
452 filename = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
453 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
454 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
455 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
456 filename = pattern;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
457 #ifdef _AMIGA
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
458 dirname = "";
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
459 #else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
460 dirname = ".";
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
461 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
462 dirlen = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
463 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
464 }
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
465 else if (filename == pattern
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
466 || (filename == pattern + 1 && pattern[0] == '\\'
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
467 && (flags & GLOB_NOESCAPE) == 0))
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
468 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
469 /* "/pattern" or "\\/pattern". */
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
470 dirname = "/";
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
471 dirlen = 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
472 ++filename;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
473 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
474 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
475 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
476 char *newp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
477 dirlen = filename - pattern;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
478 #if defined __MSDOS__ || defined WINDOWS32
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
479 if (*filename == ':'
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
480 || (filename > pattern + 1 && filename[-1] == ':'))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
481 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
482 char *drive_spec;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
483
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
484 ++dirlen;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
485 drive_spec = __alloca (dirlen + 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
486 *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
487 /* For now, disallow wildcards in the drive spec, to
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
488 prevent infinite recursion in glob. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
489 if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
490 return GLOB_NOMATCH;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
491 /* If this is "d:pattern", we need to copy `:' to DIRNAME
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
492 as well. If it's "d:/pattern", don't remove the slash
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
493 from "d:/", since "d:" and "d:/" are not the same.*/
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
494 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
495 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
496 newp = __alloca (dirlen + 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
497 *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
498 dirname = newp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
499 ++filename;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
500
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
501 if (filename[0] == '\0'
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
502 #if defined __MSDOS__ || defined WINDOWS32
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
503 && dirname[dirlen - 1] != ':'
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
504 && (dirlen < 3 || dirname[dirlen - 2] != ':'
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
505 || dirname[dirlen - 1] != '/')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
506 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
507 && dirlen > 1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
508 /* "pattern/". Expand "pattern", appending slashes. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
509 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
510 int orig_flags = flags;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
511 int val;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
512 if (!(flags & GLOB_NOESCAPE) && dirname[dirlen - 1] == '\\')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
513 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
514 /* "pattern\\/". Remove the final backslash if it hasn't
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
515 been quoted. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
516 char *p = (char *) &dirname[dirlen - 1];
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
517
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
518 while (p > dirname && p[-1] == '\\') --p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
519 if ((&dirname[dirlen] - p) & 1)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
520 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
521 *(char *) &dirname[--dirlen] = '\0';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
522 flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
523 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
524 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
525 val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
526 if (val == 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
527 pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
528 | (flags & GLOB_MARK));
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
529 else if (val == GLOB_NOMATCH && flags != orig_flags)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
530 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
531 /* Make sure globfree (&dirs); is a nop. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
532 dirs.gl_pathv = NULL;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
533 flags = orig_flags;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
534 oldcount = pglob->gl_pathc + pglob->gl_offs;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
535 goto no_matches;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
536 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
537 return val;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
538 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
539 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
540
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
541 if (!(flags & GLOB_APPEND))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
542 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
543 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
544 if (!(flags & GLOB_DOOFFS))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
545 pglob->gl_pathv = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
546 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
547 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
548 size_t i;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
549 pglob->gl_pathv = malloc ((pglob->gl_offs + 1) * sizeof (char *));
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
550 if (pglob->gl_pathv == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
551 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
552
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
553 for (i = 0; i <= pglob->gl_offs; ++i)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
554 pglob->gl_pathv[i] = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
555 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
556 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
557
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
558 oldcount = pglob->gl_pathc + pglob->gl_offs;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
559
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
560 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
561 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
562 if (dirname[1] == '\0' || dirname[1] == '/'
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
563 || (!(flags & GLOB_NOESCAPE) && dirname[1] == '\\'
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
564 && (dirname[2] == '\0' || dirname[2] == '/')))
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
565 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
566 /* Look up home directory. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
567 const char *home_dir = getenv ("HOME");
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
568 # ifdef _AMIGA
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
569 if (home_dir == NULL || home_dir[0] == '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
570 home_dir = "SYS:";
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
571 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
572 # ifdef WINDOWS32
10423
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
573 /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
574 to HOME, because the user can change HOME. */
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
575 if (home_dir == NULL || home_dir[0] == '\0')
10423
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
576 {
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
577 const char *home_drive = getenv ("HOMEDRIVE");
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
578 const char *home_path = getenv ("HOMEPATH");
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
579
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
580 if (home_drive != NULL && home_path != NULL)
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
581 {
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
582 size_t home_drive_len = strlen (home_drive);
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
583 size_t home_path_len = strlen (home_path);
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
584 char *mem = alloca (home_drive_len + home_path_len + 1);
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
585
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
586 memcpy (mem, home_drive, home_drive_len);
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
587 memcpy (mem + home_drive_len, home_path, home_path_len + 1);
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
588 home_dir = mem;
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
589 }
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
590 else
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
591 home_dir = "c:/users/default"; /* poor default */
51c125f4cd8d Make glob work on mingw.
Bruno Haible <bruno@clisp.org>
parents: 9892
diff changeset
592 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
593 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
594 if (home_dir == NULL || home_dir[0] == '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
595 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
596 int success;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
597 char *name;
6218
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
598 size_t buflen = GET_LOGIN_NAME_MAX () + 1;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
599
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
600 if (buflen == 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
601 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
602 a moderate value. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
603 buflen = 20;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
604 name = __alloca (buflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
605
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
606 success = getlogin_r (name, buflen) == 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
607 if (success)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
608 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
609 struct passwd *p;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
610 # if defined HAVE_GETPWNAM_R || defined _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
611 long int pwbuflen = GETPW_R_SIZE_MAX ();
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
612 char *pwtmpbuf;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
613 struct passwd pwbuf;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
614 int save = errno;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
615
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
616 # ifndef _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
617 if (pwbuflen == -1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
618 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
619 Try a moderate value. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
620 pwbuflen = 1024;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
621 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
622 pwtmpbuf = __alloca (pwbuflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
623
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
624 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
625 != 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
626 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
627 if (errno != ERANGE)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
628 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
629 p = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
630 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
631 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
632 # ifdef _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
633 pwtmpbuf = extend_alloca (pwtmpbuf, pwbuflen,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
634 2 * pwbuflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
635 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
636 pwbuflen *= 2;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
637 pwtmpbuf = __alloca (pwbuflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
638 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
639 __set_errno (save);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
640 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
641 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
642 p = getpwnam (name);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
643 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
644 if (p != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
645 home_dir = p->pw_dir;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
646 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
647 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
648 if (home_dir == NULL || home_dir[0] == '\0')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
649 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
650 if (flags & GLOB_TILDE_CHECK)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
651 return GLOB_NOMATCH;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
652 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
653 home_dir = "~"; /* No luck. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
654 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
655 # endif /* WINDOWS32 */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
656 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
657 /* Now construct the full directory. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
658 if (dirname[1] == '\0')
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
659 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
660 dirname = home_dir;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
661 dirlen = strlen (dirname);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
662 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
663 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
664 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
665 char *newp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
666 size_t home_len = strlen (home_dir);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
667 newp = __alloca (home_len + dirlen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
668 mempcpy (mempcpy (newp, home_dir, home_len),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
669 &dirname[1], dirlen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
670 dirname = newp;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
671 dirlen += home_len - 1;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
672 }
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
673 dirname_modified = 1;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
674 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
675 # if !defined _AMIGA && !defined WINDOWS32
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
676 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
677 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
678 char *end_name = strchr (dirname, '/');
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
679 const char *user_name;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
680 const char *home_dir;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
681 char *unescape = NULL;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
682
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
683 if (!(flags & GLOB_NOESCAPE))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
684 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
685 if (end_name == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
686 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
687 unescape = strchr (dirname, '\\');
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
688 if (unescape)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
689 end_name = strchr (unescape, '\0');
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
690 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
691 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
692 unescape = memchr (dirname, '\\', end_name - dirname);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
693 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
694 if (end_name == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
695 user_name = dirname + 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
696 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
697 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
698 char *newp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
699 newp = __alloca (end_name - dirname);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
700 *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
701 = '\0';
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
702 if (unescape != NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
703 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
704 char *p = mempcpy (newp, dirname + 1,
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
705 unescape - dirname - 1);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
706 char *q = unescape;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
707 while (*q != '\0')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
708 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
709 if (*q == '\\')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
710 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
711 if (q[1] == '\0')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
712 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
713 /* "~fo\\o\\" unescape to user_name "foo\\",
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
714 but "~fo\\o\\/" unescape to user_name
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
715 "foo". */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
716 if (filename == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
717 *p++ = '\\';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
718 break;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
719 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
720 ++q;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
721 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
722 *p++ = *q++;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
723 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
724 *p = '\0';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
725 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
726 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
727 *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
728 = '\0';
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
729 user_name = newp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
730 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
731
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
732 /* Look up specific user's home directory. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
733 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
734 struct passwd *p;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
735 # if defined HAVE_GETPWNAM_R || defined _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
736 long int buflen = GETPW_R_SIZE_MAX ();
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
737 char *pwtmpbuf;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
738 struct passwd pwbuf;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
739 int save = errno;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
740
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
741 # ifndef _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
742 if (buflen == -1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
743 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
744 moderate value. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
745 buflen = 1024;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
746 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
747 pwtmpbuf = __alloca (buflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
748
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
749 while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
750 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
751 if (errno != ERANGE)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
752 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
753 p = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
754 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
755 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
756 # ifdef _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
757 pwtmpbuf = extend_alloca (pwtmpbuf, buflen, 2 * buflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
758 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
759 buflen *= 2;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
760 pwtmpbuf = __alloca (buflen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
761 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
762 __set_errno (save);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
763 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
764 # else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
765 p = getpwnam (user_name);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
766 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
767 if (p != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
768 home_dir = p->pw_dir;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
769 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
770 home_dir = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
771 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
772 /* If we found a home directory use this. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
773 if (home_dir != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
774 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
775 char *newp;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
776 size_t home_len = strlen (home_dir);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
777 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
778 newp = __alloca (home_len + rest_len + 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
779 *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
780 end_name, rest_len)) = '\0';
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
781 dirname = newp;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
782 dirlen = home_len + rest_len;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
783 dirname_modified = 1;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
784 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
785 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
786 if (flags & GLOB_TILDE_CHECK)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
787 /* We have to regard it as an error if we cannot find the
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
788 home directory. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
789 return GLOB_NOMATCH;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
790 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
791 # endif /* Not Amiga && not WINDOWS32. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
792 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
793
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
794 /* Now test whether we looked for "~" or "~NAME". In this case we
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
795 can give the answer now. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
796 if (filename == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
797 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
798 struct stat st;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
799 struct_stat64 st64;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
800
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
801 /* Return the directory if we don't check for error or if it exists. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
802 if ((flags & GLOB_NOCHECK)
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
803 || (((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
804 ? ((*pglob->gl_stat) (dirname, &st) == 0
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
805 && S_ISDIR (st.st_mode))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
806 : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
807 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
808 int newcount = pglob->gl_pathc + pglob->gl_offs;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
809 char **new_gl_pathv;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
810
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
811 new_gl_pathv
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
812 = realloc (pglob->gl_pathv, (newcount + 1 + 1) * sizeof (char *));
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
813 if (new_gl_pathv == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
814 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
815 nospace:
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
816 free (pglob->gl_pathv);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
817 pglob->gl_pathv = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
818 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
819 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
820 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
821 pglob->gl_pathv = new_gl_pathv;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
822
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
823 if (flags & GLOB_MARK)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
824 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
825 char *p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
826 pglob->gl_pathv[newcount] = malloc (dirlen + 2);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
827 if (pglob->gl_pathv[newcount] == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
828 goto nospace;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
829 p = mempcpy (pglob->gl_pathv[newcount], dirname, dirlen);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
830 p[0] = '/';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
831 p[1] = '\0';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
832 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
833 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
834 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
835 pglob->gl_pathv[newcount] = strdup (dirname);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
836 if (pglob->gl_pathv[newcount] == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
837 goto nospace;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
838 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
839 pglob->gl_pathv[++newcount] = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
840 ++pglob->gl_pathc;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
841 pglob->gl_flags = flags;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
842
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
843 return 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
844 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
845
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
846 /* Not found. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
847 return GLOB_NOMATCH;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
848 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
849
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
850 meta = __glob_pattern_type (dirname, !(flags & GLOB_NOESCAPE));
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
851 /* meta is 1 if correct glob pattern containing metacharacters.
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
852 If meta has bit (1 << 2) set, it means there was an unterminated
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
853 [ which we handle the same, using fnmatch. Broken unterminated
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
854 pattern bracket expressions ought to be rare enough that it is
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
855 not worth special casing them, fnmatch will do the right thing. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
856 if (meta & 5)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
857 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
858 /* The directory name contains metacharacters, so we
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
859 have to glob for the directory, and then glob for
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
860 the pattern in each directory found. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
861 size_t i;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
862
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
863 if (!(flags & GLOB_NOESCAPE) && dirlen > 0 && dirname[dirlen - 1] == '\\')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
864 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
865 /* "foo\\/bar". Remove the final backslash from dirname
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
866 if it has not been quoted. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
867 char *p = (char *) &dirname[dirlen - 1];
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
868
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
869 while (p > dirname && p[-1] == '\\') --p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
870 if ((&dirname[dirlen] - p) & 1)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
871 *(char *) &dirname[--dirlen] = '\0';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
872 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
873
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
874 if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) != 0, 0))
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
875 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
876 /* Use the alternative access functions also in the recursive
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
877 call. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
878 dirs.gl_opendir = pglob->gl_opendir;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
879 dirs.gl_readdir = pglob->gl_readdir;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
880 dirs.gl_closedir = pglob->gl_closedir;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
881 dirs.gl_stat = pglob->gl_stat;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
882 dirs.gl_lstat = pglob->gl_lstat;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
883 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
884
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
885 status = glob (dirname,
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
886 ((flags & (GLOB_ERR | GLOB_NOESCAPE
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
887 | GLOB_ALTDIRFUNC))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
888 | GLOB_NOSORT | GLOB_ONLYDIR),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
889 errfunc, &dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
890 if (status != 0)
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
891 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
892 if ((flags & GLOB_NOCHECK) == 0 || status != GLOB_NOMATCH)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
893 return status;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
894 goto no_matches;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
895 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
896
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
897 /* We have successfully globbed the preceding directory name.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
898 For each name we found, call glob_in_dir on it and FILENAME,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
899 appending the results to PGLOB. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
900 for (i = 0; i < dirs.gl_pathc; ++i)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
901 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
902 int old_pathc;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
903
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
904 #ifdef SHELL
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
905 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
906 /* Make globbing interruptible in the bash shell. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
907 extern int interrupt_state;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
908
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
909 if (interrupt_state)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
910 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
911 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
912 return GLOB_ABORTED;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
913 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
914 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
915 #endif /* SHELL. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
916
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
917 old_pathc = pglob->gl_pathc;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
918 status = glob_in_dir (filename, dirs.gl_pathv[i],
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
919 ((flags | GLOB_APPEND)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
920 & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
921 errfunc, pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
922 if (status == GLOB_NOMATCH)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
923 /* No matches in this directory. Try the next. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
924 continue;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
925
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
926 if (status != 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
927 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
928 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
929 globfree (pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
930 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
931 return status;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
932 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
933
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
934 /* Stick the directory on the front of each name. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
935 if (prefix_array (dirs.gl_pathv[i],
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
936 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
937 pglob->gl_pathc - old_pathc))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
938 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
939 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
940 globfree (pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
941 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
942 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
943 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
944 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
945
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
946 flags |= GLOB_MAGCHAR;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
947
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
948 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
949 But if we have not found any matching entry and the GLOB_NOCHECK
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
950 flag was set we must return the input pattern itself. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
951 if (pglob->gl_pathc + pglob->gl_offs == oldcount)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
952 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
953 no_matches:
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
954 /* No matches. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
955 if (flags & GLOB_NOCHECK)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
956 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
957 int newcount = pglob->gl_pathc + pglob->gl_offs;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
958 char **new_gl_pathv;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
959
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
960 new_gl_pathv = realloc (pglob->gl_pathv,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
961 (newcount + 2) * sizeof (char *));
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
962 if (new_gl_pathv == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
963 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
964 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
965 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
966 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
967 pglob->gl_pathv = new_gl_pathv;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
968
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
969 pglob->gl_pathv[newcount] = strdup (pattern);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
970 if (pglob->gl_pathv[newcount] == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
971 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
972 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
973 globfree (pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
974 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
975 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
976 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
977
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
978 ++pglob->gl_pathc;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
979 ++newcount;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
980
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
981 pglob->gl_pathv[newcount] = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
982 pglob->gl_flags = flags;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
983 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
984 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
985 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
986 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
987 return GLOB_NOMATCH;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
988 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
989 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
990
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
991 globfree (&dirs);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
992 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
993 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
994 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
995 int old_pathc = pglob->gl_pathc;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
996 int orig_flags = flags;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
997
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
998 if (meta & 2)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
999 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1000 char *p = strchr (dirname, '\\'), *q;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1001 /* We need to unescape the dirname string. It is certainly
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1002 allocated by alloca, as otherwise filename would be NULL
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1003 or dirname wouldn't contain backslashes. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1004 q = p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1005 do
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1006 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1007 if (*p == '\\')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1008 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1009 *q = *++p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1010 --dirlen;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1011 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1012 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1013 *q = *p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1014 ++q;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1015 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1016 while (*p++ != '\0');
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1017 dirname_modified = 1;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1018 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1019 if (dirname_modified)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1020 flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1021 status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1022 if (status != 0)
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1023 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1024 if (status == GLOB_NOMATCH && flags != orig_flags
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1025 && pglob->gl_pathc + pglob->gl_offs == oldcount)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1026 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1027 /* Make sure globfree (&dirs); is a nop. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1028 dirs.gl_pathv = NULL;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1029 flags = orig_flags;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1030 goto no_matches;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1031 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1032 return status;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1033 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1034
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1035 if (dirlen > 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1036 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1037 /* Stick the directory on the front of each name. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1038 if (prefix_array (dirname,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1039 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1040 pglob->gl_pathc - old_pathc))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1041 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1042 globfree (pglob);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1043 pglob->gl_pathc = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1044 return GLOB_NOSPACE;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1045 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1046 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1047 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1048
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1049 if (flags & GLOB_MARK)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1050 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1051 /* Append slashes to directory names. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1052 size_t i;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1053 struct stat st;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1054 struct_stat64 st64;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1055
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1056 for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1057 if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1058 ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1059 && S_ISDIR (st.st_mode))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1060 : (__stat64 (pglob->gl_pathv[i], &st64) == 0
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1061 && S_ISDIR (st64.st_mode))))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1062 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1063 size_t len = strlen (pglob->gl_pathv[i]) + 2;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1064 char *new = realloc (pglob->gl_pathv[i], len);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1065 if (new == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1066 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1067 globfree (pglob);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1068 pglob->gl_pathc = 0;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1069 return GLOB_NOSPACE;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1070 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1071 strcpy (&new[len - 2], "/");
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1072 pglob->gl_pathv[i] = new;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1073 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1074 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1075
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1076 if (!(flags & GLOB_NOSORT))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1077 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1078 /* Sort the vector. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1079 qsort (&pglob->gl_pathv[oldcount],
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1080 pglob->gl_pathc + pglob->gl_offs - oldcount,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1081 sizeof (char *), collated_compare);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1082 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1083
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1084 return 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1085 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1086 #if defined _LIBC && !defined glob
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1087 libc_hidden_def (glob)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1088 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1089
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1090
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1091 #if !defined _LIBC || !defined GLOB_ONLY_P
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1092
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1093 /* Free storage allocated in PGLOB by a previous `glob' call. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1094 void
6218
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
1095 globfree (pglob)
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
1096 register glob_t *pglob;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1097 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1098 if (pglob->gl_pathv != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1099 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1100 size_t i;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1101 for (i = 0; i < pglob->gl_pathc; ++i)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1102 if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1103 free (pglob->gl_pathv[pglob->gl_offs + i]);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1104 free (pglob->gl_pathv);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1105 pglob->gl_pathv = NULL;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1106 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1107 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1108 #if defined _LIBC && !defined globfree
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1109 libc_hidden_def (globfree)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1110 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1111
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1112
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1113 /* Do a collated comparison of A and B. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1114 static int
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1115 collated_compare (const void *a, const void *b)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1116 {
6860
58381f8b1b9b * glob.c (collated_compare): Remove 'const' uses that weren't needed.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6689
diff changeset
1117 char *const *ps1 = a; char *s1 = *ps1;
58381f8b1b9b * glob.c (collated_compare): Remove 'const' uses that weren't needed.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6689
diff changeset
1118 char *const *ps2 = b; char *s2 = *ps2;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1119
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1120 if (s1 == s2)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1121 return 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1122 if (s1 == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1123 return 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1124 if (s2 == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1125 return -1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1126 return strcoll (s1, s2);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1127 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1128
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1129
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1130 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1131 elements in place. Return nonzero if out of memory, zero if successful.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1132 A slash is inserted between DIRNAME and each elt of ARRAY,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1133 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1134 static int
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1135 prefix_array (const char *dirname, char **array, size_t n)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1136 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1137 register size_t i;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1138 size_t dirlen = strlen (dirname);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1139 #if defined __MSDOS__ || defined WINDOWS32
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1140 int sep_char = '/';
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1141 # define DIRSEP_CHAR sep_char
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1142 #else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1143 # define DIRSEP_CHAR '/'
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1144 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1145
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1146 if (dirlen == 1 && dirname[0] == '/')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1147 /* DIRNAME is just "/", so normal prepending would get us "//foo".
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1148 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1149 dirlen = 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1150 #if defined __MSDOS__ || defined WINDOWS32
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1151 else if (dirlen > 1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1152 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1153 if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1154 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1155 --dirlen;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1156 else if (dirname[dirlen - 1] == ':')
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1157 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1158 /* DIRNAME is "d:". Use `:' instead of `/'. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1159 --dirlen;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1160 sep_char = ':';
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1161 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1162 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1163 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1164
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1165 for (i = 0; i < n; ++i)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1166 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1167 size_t eltlen = strlen (array[i]) + 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1168 char *new = malloc (dirlen + 1 + eltlen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1169 if (new == NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1170 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1171 while (i > 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1172 free (array[--i]);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1173 return 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1174 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1175
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1176 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1177 char *endp = mempcpy (new, dirname, dirlen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1178 *endp++ = DIRSEP_CHAR;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1179 mempcpy (endp, array[i], eltlen);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1180 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1181 free (array[i]);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1182 array[i] = new;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1183 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1184
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1185 return 0;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1186 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1187
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1188
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1189 /* We must not compile this function twice. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1190 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1191 int
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1192 __glob_pattern_type (pattern, quote)
6218
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
1193 const char *pattern;
71a1ca6e85c0 * lib/glob.c (glob, globfree, __glob_pattern_p): Use old-style function
Paul Eggert <eggert@cs.ucla.edu>
parents: 6198
diff changeset
1194 int quote;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1195 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1196 register const char *p;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1197 int ret = 0;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1198
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1199 for (p = pattern; *p != '\0'; ++p)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1200 switch (*p)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1201 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1202 case '?':
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1203 case '*':
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1204 return 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1205
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1206 case '\\':
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1207 if (quote)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1208 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1209 if (p[1] != '\0')
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1210 ++p;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1211 ret |= 2;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1212 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1213 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1214
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1215 case '[':
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1216 ret |= 4;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1217 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1218
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1219 case ']':
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1220 if (ret & 4)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1221 return 1;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1222 break;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1223 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1224
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1225 return ret;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1226 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1227
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1228 /* Return nonzero if PATTERN contains any metacharacters.
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1229 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1230 int
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1231 __glob_pattern_p (pattern, quote)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1232 const char *pattern;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1233 int quote;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1234 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1235 return __glob_pattern_type (pattern, quote) == 1;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1236 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1237 # ifdef _LIBC
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1238 weak_alias (__glob_pattern_p, glob_pattern_p)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1239 # endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1240 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1241
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1242 #endif /* !GLOB_ONLY_P */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1243
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1244
9557
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1245 #if !defined _LIBC || !defined GLOB_ONLY_P
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1246 /* We put this in a separate function mainly to allow the memory
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1247 allocated with alloca to be recycled. */
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1248 static int
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1249 __attribute_noinline__
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1250 link_exists2_p (const char *dir, size_t dirlen, const char *fname,
9557
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1251 glob_t *pglob
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1252 # if !defined _LIBC && !HAVE_FSTATAT
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1253 , int flags
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1254 # endif
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1255 )
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1256 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1257 size_t fnamelen = strlen (fname);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1258 char *fullname = __alloca (dirlen + 1 + fnamelen + 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1259 struct stat st;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1260
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1261 mempcpy (mempcpy (mempcpy (fullname, dir, dirlen), "/", 1),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1262 fname, fnamelen + 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1263
9557
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1264 # if !defined _LIBC && !HAVE_FSTATAT
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1265 if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) == 0, 1))
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1266 {
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1267 struct_stat64 st64;
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1268 return __stat64 (fullname, &st64) == 0;
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1269 }
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1270 # endif
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1271 return (*pglob->gl_stat) (fullname, &st) == 0;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1272 }
9357
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1273
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1274 /* Return true if DIR/FNAME exists. */
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1275 static int
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1276 link_exists_p (int dfd, const char *dir, size_t dirlen, const char *fname,
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1277 glob_t *pglob, int flags)
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1278 {
9557
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1279 # if defined _LIBC || HAVE_FSTATAT
9357
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1280 if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1281 return link_exists2_p (dir, dirlen, fname, pglob);
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1282 else
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1283 {
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1284 struct_stat64 st64;
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1285 return __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0;
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1286 }
9557
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1287 # else
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1288 return link_exists2_p (dir, dirlen, fname, pglob, flags);
81a0ee2e4e00 Ensure that 'glob' stays under LGPLv2+.
Bruno Haible <bruno@clisp.org>
parents: 9549
diff changeset
1289 # endif
9357
75e43b0e5159 Modify glob.c to use fstatat and dirfd, to simplify it.
Paul Eggert <eggert@cs.ucla.edu>
parents: 9351
diff changeset
1290 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1291 #endif
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1292
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1293
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1294 /* Like `glob', but PATTERN is a final pathname component,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1295 and matches are searched for in DIRECTORY.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1296 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1297 The GLOB_APPEND flag is assumed to be set (always appends). */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1298 static int
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1299 glob_in_dir (const char *pattern, const char *directory, int flags,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1300 int (*errfunc) (const char *, int),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1301 glob_t *pglob)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1302 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1303 size_t dirlen = strlen (directory);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1304 void *stream = NULL;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1305 struct globnames
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1306 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1307 struct globnames *next;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1308 size_t count;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1309 char *name[64];
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1310 };
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1311 #define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1312 struct globnames init_names;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1313 struct globnames *names = &init_names;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1314 struct globnames *names_alloca = &init_names;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1315 size_t nfound = 0;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1316 size_t allocasize = sizeof (init_names);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1317 size_t cur = 0;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1318 int meta;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1319 int save;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1320 int result;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1321
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1322 init_names.next = NULL;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1323 init_names.count = INITIAL_COUNT;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1324
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1325 meta = __glob_pattern_type (pattern, !(flags & GLOB_NOESCAPE));
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1326 if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1327 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1328 /* We need not do any tests. The PATTERN contains no meta
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1329 characters and we must not return an error therefore the
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1330 result will always contain exactly one name. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1331 flags |= GLOB_NOCHECK;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1332 }
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1333 else if (meta == 0)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1334 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1335 /* Since we use the normal file functions we can also use stat()
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1336 to verify the file is there. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1337 struct stat st;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1338 struct_stat64 st64;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1339 size_t patlen = strlen (pattern);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1340 char *fullname = __alloca (dirlen + 1 + patlen + 1);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1341
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1342 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1343 "/", 1),
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1344 pattern, patlen + 1);
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1345 if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1346 ? (*pglob->gl_stat) (fullname, &st)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1347 : __stat64 (fullname, &st64)) == 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1348 /* We found this file to be existing. Now tell the rest
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1349 of the function to copy this name into the result. */
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1350 flags |= GLOB_NOCHECK;
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1351 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1352 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1353 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1354 stream = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1355 ? (*pglob->gl_opendir) (directory)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1356 : opendir (directory));
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1357 if (stream == NULL)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1358 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1359 if (errno != ENOTDIR
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1360 && ((errfunc != NULL && (*errfunc) (directory, errno))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1361 || (flags & GLOB_ERR)))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1362 return GLOB_ABORTED;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1363 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1364 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1365 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1366 int dfd = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1367 ? -1 : dirfd ((DIR *) stream));
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1368 int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1369 | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1370 #if defined _AMIGA || defined VMS
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1371 | FNM_CASEFOLD
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1372 #endif
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1373 );
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1374 flags |= GLOB_MAGCHAR;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1375
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1376 while (1)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1377 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1378 const char *name;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1379 size_t len;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1380 #if defined _LIBC && !defined COMPILE_GLOB64
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1381 struct dirent64 *d;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1382 union
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1383 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1384 struct dirent64 d64;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1385 char room [offsetof (struct dirent64, d_name[0])
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1386 + NAME_MAX + 1];
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1387 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1388 d64buf;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1389
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1390 if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1391 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1392 struct dirent *d32 = (*pglob->gl_readdir) (stream);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1393 if (d32 != NULL)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1394 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1395 CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1396 d = &d64buf.d64;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1397 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1398 else
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1399 d = NULL;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1400 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1401 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1402 d = __readdir64 (stream);
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1403 #else
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1404 struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1405 ? ((struct dirent *)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1406 (*pglob->gl_readdir) (stream))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1407 : __readdir (stream));
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1408 #endif
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1409 if (d == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1410 break;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1411 if (! REAL_DIR_ENTRY (d))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1412 continue;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1413
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1414 /* If we shall match only directories use the information
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1415 provided by the dirent call if possible. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1416 if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1417 continue;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1418
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1419 name = d->d_name;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1420
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1421 if (fnmatch (pattern, name, fnm_flags) == 0)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1422 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1423 /* If the file we found is a symlink we have to
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1424 make sure the target file exists. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1425 if (!DIRENT_MIGHT_BE_SYMLINK (d)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1426 || link_exists_p (dfd, directory, dirlen, name, pglob,
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1427 flags))
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1428 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1429 if (cur == names->count)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1430 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1431 struct globnames *newnames;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1432 size_t count = names->count * 2;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1433 size_t size = (sizeof (struct globnames)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1434 + ((count - INITIAL_COUNT)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1435 * sizeof (char *)));
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1436 allocasize += size;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1437 if (__libc_use_alloca (allocasize))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1438 newnames = names_alloca = __alloca (size);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1439 else if ((newnames = malloc (size))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1440 == NULL)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1441 goto memory_error;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1442 newnames->count = count;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1443 newnames->next = names;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1444 names = newnames;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1445 cur = 0;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1446 }
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1447 len = _D_EXACT_NAMLEN (d);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1448 names->name[cur] = malloc (len + 1);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1449 if (names->name[cur] == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1450 goto memory_error;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1451 *((char *) mempcpy (names->name[cur++], name, len))
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1452 = '\0';
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1453 ++nfound;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1454 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1455 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1456 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1457 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1458 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1459
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1460 if (nfound == 0 && (flags & GLOB_NOCHECK))
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1461 {
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1462 size_t len = strlen (pattern);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1463 nfound = 1;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1464 names->name[cur] = malloc (len + 1);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1465 if (names->name[cur] == NULL)
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1466 goto memory_error;
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1467 *((char *) mempcpy (names->name[cur++], pattern, len)) = '\0';
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1468 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1469
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1470 result = GLOB_NOMATCH;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1471 if (nfound != 0)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1472 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1473 char **new_gl_pathv
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1474 = realloc (pglob->gl_pathv,
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1475 (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1476 * sizeof (char *));
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1477 result = 0;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1478
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1479 if (new_gl_pathv == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1480 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1481 memory_error:
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1482 while (1)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1483 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1484 struct globnames *old = names;
9549
de8a758aeb9a Use plain ANSI C syntax.
Bruno Haible <bruno@clisp.org>
parents: 9357
diff changeset
1485 size_t i;
de8a758aeb9a Use plain ANSI C syntax.
Bruno Haible <bruno@clisp.org>
parents: 9357
diff changeset
1486 for (i = 0; i < cur; ++i)
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1487 free (names->name[i]);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1488 names = names->next;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1489 /* NB: we will not leak memory here if we exit without
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1490 freeing the current block assigned to OLD. At least
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1491 the very first block is always allocated on the stack
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1492 and this is the block assigned to OLD here. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1493 if (names == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1494 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1495 assert (old == &init_names);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1496 break;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1497 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1498 cur = names->count;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1499 if (old == names_alloca)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1500 names_alloca = names;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1501 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1502 free (old);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1503 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1504 result = GLOB_NOSPACE;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1505 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1506 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1507 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1508 while (1)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1509 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1510 struct globnames *old = names;
9549
de8a758aeb9a Use plain ANSI C syntax.
Bruno Haible <bruno@clisp.org>
parents: 9357
diff changeset
1511 size_t i;
de8a758aeb9a Use plain ANSI C syntax.
Bruno Haible <bruno@clisp.org>
parents: 9357
diff changeset
1512 for (i = 0; i < cur; ++i)
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1513 new_gl_pathv[pglob->gl_offs + pglob->gl_pathc++]
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1514 = names->name[i];
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1515 names = names->next;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1516 /* NB: we will not leak memory here if we exit without
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1517 freeing the current block assigned to OLD. At least
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1518 the very first block is always allocated on the stack
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1519 and this is the block assigned to OLD here. */
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1520 if (names == NULL)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1521 {
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1522 assert (old == &init_names);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1523 break;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1524 }
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1525 cur = names->count;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1526 if (old == names_alloca)
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1527 names_alloca = names;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1528 else
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1529 free (old);
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1530 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1531
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1532 pglob->gl_pathv = new_gl_pathv;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1533
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1534 pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1535
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1536 pglob->gl_flags = flags;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1537 }
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1538 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1539
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1540 if (stream != NULL)
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1541 {
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1542 save = errno;
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1543 if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1544 (*pglob->gl_closedir) (stream);
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1545 else
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1546 closedir (stream);
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1547 __set_errno (save);
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1548 }
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1549
9351
7ab454b59c21 Merge glibc changes into lib/glob.c.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8439
diff changeset
1550 return result;
5898
429b55c14554 * MODULES.html.sh: Add glob to Enhanced POSIX.2001 section.
Derek R. Price <derek@ximbiot.com>
parents:
diff changeset
1551 }