Mercurial > hg > octave-kai > gnulib-hg
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 |
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 | 46 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
47 # define WINDOWS32 | |
48 #endif | |
49 | |
50 #ifndef WINDOWS32 | |
51 # include <pwd.h> | |
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 | 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 | 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 | 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 | 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 | 573 /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference |
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 | 576 { |
577 const char *home_drive = getenv ("HOMEDRIVE"); | |
578 const char *home_path = getenv ("HOMEPATH"); | |
579 | |
580 if (home_drive != NULL && home_path != NULL) | |
581 { | |
582 size_t home_drive_len = strlen (home_drive); | |
583 size_t home_path_len = strlen (home_path); | |
584 char *mem = alloca (home_drive_len + home_path_len + 1); | |
585 | |
586 memcpy (mem, home_drive, home_drive_len); | |
587 memcpy (mem + home_drive_len, home_path, home_path_len + 1); | |
588 home_dir = mem; | |
589 } | |
590 else | |
591 home_dir = "c:/users/default"; /* poor default */ | |
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 | 1485 size_t i; |
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 | 1511 size_t i; |
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 } |