Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/getcwd.c @ 6949:96af1224c6fa
* backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Ignore the obsolescent !HAVE_DIRENT_H case. Consolidate NAMLEN
macros into the GNU _D_EXACT_NAMLEN.
* savedir.c: Likewise.
(savedirstream): Use _D_EXACT_NAMLEN in preference to strlen.
* backupfile.m4, d-ino.m4, d-type.m4, dirfd.m4, fts.m4, getcwd.m4:
* savedir.m4:
Ignore the obsolescent !HAVE_DIRENT_H case. Consolidate NAMLEN
macros into the GNU _D_EXACT_NAMLEN.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Tue, 11 Jul 2006 06:02:51 +0000 |
parents | d68ff786c180 |
children | 8a1a9361108c |
rev | line source |
---|---|
6647
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
1 /* Copyright (C) 1991,92,93,94,95,96,97,98,99,2004,2005,2006 Free Software |
5907 | 2 Foundation, Inc. |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
3 This file is part of the GNU C Library. |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
4 |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
5 This program is free software; you can redistribute it and/or modify |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
6 it under the terms of the GNU General Public License as published by |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
7 the Free Software Foundation; either version 2, or (at your option) |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
8 any later version. |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
9 |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
10 This program is distributed in the hope that it will be useful, |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
13 GNU General Public License for more details. |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
14 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
15 You should have received a copy of the GNU General Public License along |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
16 with this program; if not, write to the Free Software Foundation, |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5499
diff
changeset
|
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
18 |
6305
a91f807a1459
Change #ifdef<TAB>HAVE_CONFIG_H to #ifdef HAVE_CONFIG_H.
Jim Meyering <jim@meyering.net>
parents:
6275
diff
changeset
|
19 #ifdef HAVE_CONFIG_H |
6259
96c32553b4c6
Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5955
diff
changeset
|
20 # include <config.h> |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
21 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
22 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
23 #if !_LIBC |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
24 # include "getcwd.h" |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
25 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
26 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
27 #include <errno.h> |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
28 #include <sys/types.h> |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
29 #include <sys/stat.h> |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
30 #include <stdbool.h> |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
31 #include <stddef.h> |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
32 |
5955
ace6ea191424
Assume HAVE_FCNTL_H (i.e., include <fcntl.h> unconditionally,
Jim Meyering <jim@meyering.net>
parents:
5907
diff
changeset
|
33 #include <fcntl.h> /* For AT_FDCWD on Solaris 9. */ |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
34 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
35 #ifndef __set_errno |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
36 # define __set_errno(val) (errno = (val)) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
37 #endif |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
38 |
6949
96af1224c6fa
* backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Paul Eggert <eggert@cs.ucla.edu>
parents:
6934
diff
changeset
|
39 #include <dirent.h> |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
40 #ifndef _D_EXACT_NAMLEN |
6934
d68ff786c180
* lib/getloadavg.c: Use __VMS, not VMS.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6912
diff
changeset
|
41 # define _D_EXACT_NAMLEN(d) strlen ((d)->d_name) |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
42 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
43 #ifndef _D_ALLOC_NAMLEN |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
44 # define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
45 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
46 |
6275 | 47 #include <unistd.h> |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
48 #include <stdlib.h> |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
49 #include <string.h> |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
50 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
51 #if _LIBC |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
52 # ifndef mempcpy |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
53 # define mempcpy __mempcpy |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
54 # endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
55 #else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
56 # include "mempcpy.h" |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
57 #endif |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
58 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
59 #include <limits.h> |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
60 |
6647
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
61 /* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
62 value exceeds INT_MAX, so its use as an int doesn't conform to the |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
63 C standard, and GCC and Sun C complain in some cases. */ |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
64 #if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553 |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
65 # undef AT_FDCWD |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
66 # define AT_FDCWD (-3041965) |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
67 #endif |
ca74ccfe8d1b
* getcwd.c (AT_FDCWD): Work around a bug in Solaris 9 and 10, where
Paul Eggert <eggert@cs.ucla.edu>
parents:
6439
diff
changeset
|
68 |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
69 #ifdef ENAMETOOLONG |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
70 # define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG) |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
71 #else |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
72 # define is_ENAMETOOLONG(x) 0 |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
73 #endif |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
74 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
75 #ifndef MAX |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
76 # define MAX(a, b) ((a) < (b) ? (b) : (a)) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
77 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
78 #ifndef MIN |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
79 # define MIN(a, b) ((a) < (b) ? (a) : (b)) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
80 #endif |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
81 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
82 #ifndef PATH_MAX |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
83 # ifdef MAXPATHLEN |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
84 # define PATH_MAX MAXPATHLEN |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
85 # else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
86 # define PATH_MAX 1024 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
87 # endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
88 #endif |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
89 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
90 #if D_INO_IN_DIRENT |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
91 # define MATCHING_INO(dp, ino) ((dp)->d_ino == (ino)) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
92 #else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
93 # define MATCHING_INO(dp, ino) true |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
94 #endif |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
95 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
96 #if !_LIBC |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
97 # define __getcwd getcwd |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
98 # define __lstat lstat |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
99 # define __closedir closedir |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
100 # define __opendir opendir |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
101 # define __readdir readdir |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
102 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
103 |
5907 | 104 /* Get the name of the current working directory, and put it in SIZE |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
105 bytes of BUF. Returns NULL if the directory couldn't be determined or |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
106 SIZE was too small. If successful, returns BUF. In GNU, if BUF is |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
107 NULL, an array is allocated with `malloc'; the array is SIZE bytes long, |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
108 unless SIZE == 0, in which case it is as big as necessary. */ |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
109 |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
110 char * |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
111 __getcwd (char *buf, size_t size) |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
112 { |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
113 /* Lengths of big file name components and entire file names, and a |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
114 deep level of file name nesting. These numbers are not upper |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
115 bounds; they are merely large values suitable for initial |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
116 allocations, designed to be large enough for most real-world |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
117 uses. */ |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
118 enum |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
119 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
120 BIG_FILE_NAME_COMPONENT_LENGTH = 255, |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
121 BIG_FILE_NAME_LENGTH = MIN (4095, PATH_MAX - 1), |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
122 DEEP_NESTING = 100 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
123 }; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
124 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
125 #ifdef AT_FDCWD |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
126 int fd = AT_FDCWD; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
127 bool fd_needs_closing = false; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
128 #else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
129 char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1]; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
130 char *dotlist = dots; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
131 size_t dotsize = sizeof dots; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
132 size_t dotlen = 0; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
133 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
134 DIR *dirstream = NULL; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
135 dev_t rootdev, thisdev; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
136 ino_t rootino, thisino; |
5907 | 137 char *dir; |
138 register char *dirp; | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
139 struct stat st; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
140 size_t allocated = size; |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
141 size_t used; |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
142 |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
143 #if HAVE_PARTLY_WORKING_GETCWD && !defined AT_FDCWD |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
144 /* The system getcwd works, except it sometimes fails when it |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
145 shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
146 AT_FDCWD is not defined, the algorithm below is O(N**2) and this |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
147 is much slower than the system getcwd (at least on GNU/Linux). |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
148 So trust the system getcwd's results unless they look |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
149 suspicious. */ |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
150 # undef getcwd |
5907 | 151 dir = getcwd (buf, size); |
152 if (dir || (errno != ERANGE && !is_ENAMETOOLONG (errno) && errno != ENOENT)) | |
153 return dir; | |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
154 #endif |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
155 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
156 if (size == 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
157 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
158 if (buf != NULL) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
159 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
160 __set_errno (EINVAL); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
161 return NULL; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
162 } |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
163 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
164 allocated = BIG_FILE_NAME_LENGTH + 1; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
165 } |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
166 |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
167 if (buf == NULL) |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
168 { |
5907 | 169 dir = malloc (allocated); |
170 if (dir == NULL) | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
171 return NULL; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
172 } |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
173 else |
5907 | 174 dir = buf; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
175 |
5907 | 176 dirp = dir + allocated; |
177 *--dirp = '\0'; | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
178 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
179 if (__lstat (".", &st) < 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
180 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
181 thisdev = st.st_dev; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
182 thisino = st.st_ino; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
183 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
184 if (__lstat ("/", &st) < 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
185 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
186 rootdev = st.st_dev; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
187 rootino = st.st_ino; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
188 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
189 while (!(thisdev == rootdev && thisino == rootino)) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
190 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
191 struct dirent *d; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
192 dev_t dotdev; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
193 ino_t dotino; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
194 bool mount_point; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
195 int parent_status; |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
196 size_t dirroom; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
197 size_t namlen; |
6912 | 198 bool use_d_ino = true; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
199 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
200 /* Look at the parent directory. */ |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
201 #ifdef AT_FDCWD |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
202 fd = openat (fd, "..", O_RDONLY); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
203 if (fd < 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
204 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
205 fd_needs_closing = true; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
206 parent_status = fstat (fd, &st); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
207 #else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
208 dotlist[dotlen++] = '.'; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
209 dotlist[dotlen++] = '.'; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
210 dotlist[dotlen] = '\0'; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
211 parent_status = __lstat (dotlist, &st); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
212 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
213 if (parent_status != 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
214 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
215 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
216 if (dirstream && __closedir (dirstream) != 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
217 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
218 dirstream = NULL; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
219 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
220 } |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
221 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
222 /* Figure out if this directory is a mount point. */ |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
223 dotdev = st.st_dev; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
224 dotino = st.st_ino; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
225 mount_point = dotdev != thisdev; |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
226 |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
227 /* Search for the last directory. */ |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
228 #ifdef AT_FDCWD |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
229 dirstream = fdopendir (fd); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
230 if (dirstream == NULL) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
231 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
232 fd_needs_closing = false; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
233 #else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
234 dirstream = __opendir (dotlist); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
235 if (dirstream == NULL) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
236 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
237 dotlist[dotlen++] = '/'; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
238 #endif |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
239 for (;;) |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
240 { |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
241 /* Clear errno to distinguish EOF from error if readdir returns |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
242 NULL. */ |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
243 __set_errno (0); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
244 d = __readdir (dirstream); |
6912 | 245 |
246 /* When we've iterated through all directory entries without finding | |
247 one with a matching d_ino, rewind the stream and consider each | |
248 name again, but this time, using lstat. This is necessary in a | |
249 chroot on at least one system (glibc-2.3.6 + linux 2.6.12), where | |
250 .., ../.., ../../.., etc. all had the same device number, yet the | |
251 d_ino values for entries in / did not match those obtained | |
252 via lstat. */ | |
253 if (d == NULL && errno == 0 && use_d_ino) | |
254 { | |
255 use_d_ino = false; | |
256 rewinddir (dirstream); | |
257 d = __readdir (dirstream); | |
258 } | |
259 | |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
260 if (d == NULL) |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
261 { |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
262 if (errno == 0) |
6912 | 263 /* EOF on dirstream, which can mean e.g., that the current |
264 directory has been removed. */ | |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
265 __set_errno (ENOENT); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
266 goto lose; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
267 } |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
268 if (d->d_name[0] == '.' && |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
269 (d->d_name[1] == '\0' || |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
270 (d->d_name[1] == '.' && d->d_name[2] == '\0'))) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
271 continue; |
6912 | 272 |
273 if (use_d_ino) | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
274 { |
6912 | 275 bool match = (MATCHING_INO (d, thisino) || mount_point); |
276 if (! match) | |
277 continue; | |
278 } | |
279 | |
280 { | |
281 int entry_status; | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
282 #ifdef AT_FDCWD |
6912 | 283 entry_status = fstatat (fd, d->d_name, &st, AT_SYMLINK_NOFOLLOW); |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
284 #else |
6912 | 285 /* Compute size needed for this file name, or for the file |
286 name ".." in the same directory, whichever is larger. | |
287 Room for ".." might be needed the next time through | |
288 the outer loop. */ | |
289 size_t name_alloc = _D_ALLOC_NAMLEN (d); | |
290 size_t filesize = dotlen + MAX (sizeof "..", name_alloc); | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
291 |
6912 | 292 if (filesize < dotlen) |
293 goto memory_exhausted; | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
294 |
6912 | 295 if (dotsize < filesize) |
296 { | |
297 /* My, what a deep directory tree you have, Grandma. */ | |
298 size_t newsize = MAX (filesize, dotsize * 2); | |
299 size_t i; | |
300 if (newsize < dotsize) | |
301 goto memory_exhausted; | |
302 if (dotlist != dots) | |
303 free (dotlist); | |
304 dotlist = malloc (newsize); | |
305 if (dotlist == NULL) | |
306 goto lose; | |
307 dotsize = newsize; | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
308 |
6912 | 309 i = 0; |
310 do | |
311 { | |
312 dotlist[i++] = '.'; | |
313 dotlist[i++] = '.'; | |
314 dotlist[i++] = '/'; | |
315 } | |
316 while (i < dotlen); | |
317 } | |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
318 |
6912 | 319 memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d)); |
320 entry_status = __lstat (dotlist, &st); | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
321 #endif |
6912 | 322 /* We don't fail here if we cannot stat() a directory entry. |
323 This can happen when (network) file systems fail. If this | |
324 entry is in fact the one we are looking for we will find | |
325 out soon as we reach the end of the directory without | |
326 having found anything. */ | |
327 if (entry_status == 0 && S_ISDIR (st.st_mode) | |
328 && st.st_dev == thisdev && st.st_ino == thisino) | |
329 break; | |
330 } | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
331 } |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
332 |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
333 dirroom = dirp - dir; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
334 namlen = _D_EXACT_NAMLEN (d); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
335 |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
336 if (dirroom <= namlen) |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
337 { |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
338 if (size != 0) |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
339 { |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
340 __set_errno (ERANGE); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
341 goto lose; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
342 } |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
343 else |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
344 { |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
345 char *tmp; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
346 size_t oldsize = allocated; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
347 |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
348 allocated += MAX (allocated, namlen); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
349 if (allocated < oldsize |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
350 || ! (tmp = realloc (dir, allocated))) |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
351 goto memory_exhausted; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
352 |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
353 /* Move current contents up to the end of the buffer. |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
354 This is guaranteed to be non-overlapping. */ |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
355 dirp = memcpy (tmp + allocated - (oldsize - dirroom), |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
356 tmp + dirroom, |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
357 oldsize - dirroom); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
358 dir = tmp; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
359 } |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
360 } |
6439
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
361 dirp -= namlen; |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
362 memcpy (dirp, d->d_name, namlen); |
3fd547210013
* getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents:
6305
diff
changeset
|
363 *--dirp = '/'; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
364 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
365 thisdev = dotdev; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
366 thisino = dotino; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
367 } |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
368 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
369 if (dirstream && __closedir (dirstream) != 0) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
370 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
371 dirstream = NULL; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
372 goto lose; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
373 } |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
374 |
5907 | 375 if (dirp == &dir[allocated - 1]) |
376 *--dirp = '/'; | |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
377 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
378 #ifndef AT_FDCWD |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
379 if (dotlist != dots) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
380 free (dotlist); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
381 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
382 |
5907 | 383 used = dir + allocated - dirp; |
384 memmove (dir, dirp, used); | |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
385 |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
386 if (buf == NULL && size == 0) |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
387 /* Ensure that the buffer is only as large as necessary. */ |
5907 | 388 buf = realloc (dir, used); |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
389 |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
390 if (buf == NULL) |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
391 /* Either buf was NULL all along, or `realloc' failed but |
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
392 we still have the original string. */ |
5907 | 393 buf = dir; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
394 |
5499
41fd04e6a198
(is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5491
diff
changeset
|
395 return buf; |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
396 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
397 memory_exhausted: |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
398 __set_errno (ENOMEM); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
399 lose: |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
400 { |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
401 int save = errno; |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
402 if (dirstream) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
403 __closedir (dirstream); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
404 #ifdef AT_FDCWD |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
405 if (fd_needs_closing) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
406 close (fd); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
407 #else |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
408 if (dotlist != dots) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
409 free (dotlist); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
410 #endif |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
411 if (buf == NULL) |
5907 | 412 free (dir); |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
413 __set_errno (save); |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
414 } |
5136
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
415 return NULL; |
3d7c80bdf362
New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
416 } |
5491
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
417 |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
418 #ifdef weak_alias |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
419 weak_alias (__getcwd, getcwd) |
b3d5c90efc81
Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5136
diff
changeset
|
420 #endif |