annotate lib/getcwd.c @ 8623:27cfd50b8f6c

Fix missing escape.
author Bruno Haible <bruno@clisp.org>
date Tue, 03 Apr 2007 22:45:13 +0000
parents 11ae25a37675
children bbbbbf4cd1c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7944
a1d177cd9523 * doc/gnulib-tool.texi (Initial import): Update to match current
Paul Eggert <eggert@cs.ucla.edu>
parents: 7863
diff changeset
1 /* Copyright (C) 1991,92,93,94,95,96,97,98,99,2004,2005,2006,2007 Free Software
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6949
diff changeset
19 #if !_LIBC
6259
96c32553b4c6 Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5955
diff changeset
20 # include <config.h>
8199
51d32a83a7df Move more declarations into <unistd.h>.
Bruno Haible <bruno@clisp.org>
parents: 8075
diff changeset
21 # include <unistd.h>
8214
822e9380142e Minor fixups to port to Solaris 10 with Sun C 5.8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8202
diff changeset
22 # include "dirfd.h"
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
23 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
24
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
25 #include <errno.h>
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
26 #include <sys/types.h>
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
27 #include <sys/stat.h>
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
28 #include <stdbool.h>
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
29 #include <stddef.h>
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
30
5955
ace6ea191424 Assume HAVE_FCNTL_H (i.e., include <fcntl.h> unconditionally,
Jim Meyering <jim@meyering.net>
parents: 5907
diff changeset
31 #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
32
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
33 #ifndef __set_errno
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
34 # 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
35 #endif
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
36
6949
96af1224c6fa * backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Paul Eggert <eggert@cs.ucla.edu>
parents: 6934
diff changeset
37 #include <dirent.h>
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
38 #ifndef _D_EXACT_NAMLEN
6934
d68ff786c180 * lib/getloadavg.c: Use __VMS, not VMS.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6912
diff changeset
39 # 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
40 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
41 #ifndef _D_ALLOC_NAMLEN
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
42 # 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
43 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
44
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
45 #include <unistd.h>
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
46 #include <stdlib.h>
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
47 #include <string.h>
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
48
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
49 #if _LIBC
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
50 # ifndef mempcpy
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
51 # define mempcpy __mempcpy
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
52 # endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
53 #endif
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
54
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
55 #include <limits.h>
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
56
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
57 /* 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
58 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
59 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
60 #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
61 # 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
62 # 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
63 #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
64
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
65 #ifdef ENAMETOOLONG
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
66 # define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
67 #else
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
68 # define is_ENAMETOOLONG(x) 0
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
69 #endif
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
70
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
71 #ifndef MAX
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
72 # 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
73 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
74 #ifndef MIN
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
75 # 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
76 #endif
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
77
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
78 #ifndef PATH_MAX
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
79 # ifdef MAXPATHLEN
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
80 # define PATH_MAX MAXPATHLEN
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
81 # else
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
82 # define PATH_MAX 1024
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
83 # endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
84 #endif
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
85
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
86 #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
87 # 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
88 #else
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
89 # 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
90 #endif
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
91
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
92 #if !_LIBC
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
93 # define __getcwd getcwd
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
94 # define __lstat lstat
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
95 # define __closedir closedir
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
96 # define __opendir opendir
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
97 # define __readdir readdir
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
98 #endif
7863
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
99
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
100 /* The results of opendir() in this file are not used with dirfd and fchdir,
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
101 therefore save some unnecessary recursion in fchdir.c. */
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
102 #undef opendir
cb2590895141 New module 'fchdir'.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
103 #undef closedir
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
104
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
105 /* 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
106 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
107 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
108 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
109 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
110
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
111 char *
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
112 __getcwd (char *buf, size_t size)
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
113 {
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
114 /* 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
115 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
116 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
117 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
118 uses. */
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
119 enum
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
120 {
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
121 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
122 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
123 DEEP_NESTING = 100
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
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
126 #ifdef AT_FDCWD
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
127 int fd = AT_FDCWD;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
128 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
129 #else
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
130 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
131 char *dotlist = dots;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
132 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
133 size_t dotlen = 0;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
134 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
135 DIR *dirstream = NULL;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
136 dev_t rootdev, thisdev;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
137 ino_t rootino, thisino;
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
138 char *dir;
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
139 register char *dirp;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
140 struct stat st;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
141 size_t allocated = size;
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
142 size_t used;
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
143
8217
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
144 #if HAVE_PARTLY_WORKING_GETCWD
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
145 /* The system getcwd works, except it sometimes fails when it
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
146 shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
147 AT_FDCWD is not defined, the algorithm below is O(N**2) and this
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
148 is much slower than the system getcwd (at least on GNU/Linux).
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
149 So trust the system getcwd's results unless they look
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
150 suspicious.
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
151
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
152 Use the system getcwd even if we have openat support, since the
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
153 system getcwd works even when a parent is unreadable, while the
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
154 openat-based approach does not. */
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
155
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
156 # undef getcwd
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
157 dir = getcwd (buf, size);
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
158 if (dir || (errno != ERANGE && !is_ENAMETOOLONG (errno) && errno != ENOENT))
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
159 return dir;
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
160 #endif
f43bac5db7d2 * lib/getcwd.c (__getcwd): Undo previous change; it mishandled
Paul Eggert <eggert@cs.ucla.edu>
parents: 8216
diff changeset
161
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
162 if (size == 0)
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 if (buf != NULL)
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 __set_errno (EINVAL);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
167 return NULL;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
168 }
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
169
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
170 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
171 }
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 if (buf == NULL)
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
174 {
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
175 dir = malloc (allocated);
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
176 if (dir == NULL)
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
177 return NULL;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
178 }
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
179 else
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
180 dir = buf;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
181
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
182 dirp = dir + allocated;
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
183 *--dirp = '\0';
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
184
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
185 if (__lstat (".", &st) < 0)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
186 goto lose;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
187 thisdev = st.st_dev;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
188 thisino = st.st_ino;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
189
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
190 if (__lstat ("/", &st) < 0)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
191 goto lose;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
192 rootdev = st.st_dev;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
193 rootino = st.st_ino;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
194
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
195 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
196 {
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
197 struct dirent *d;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
198 dev_t dotdev;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
199 ino_t dotino;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
200 bool mount_point;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
201 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
202 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
203 size_t namlen;
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
204 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
205
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
206 /* 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
207 #ifdef AT_FDCWD
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
208 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
209 if (fd < 0)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
210 goto lose;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
211 fd_needs_closing = true;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
212 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
213 #else
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
214 dotlist[dotlen++] = '.';
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
215 dotlist[dotlen++] = '.';
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
216 dotlist[dotlen] = '\0';
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
217 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
218 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
219 if (parent_status != 0)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
220 goto lose;
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 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
223 {
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
224 dirstream = NULL;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
225 goto lose;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
226 }
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
227
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
228 /* 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
229 dotdev = st.st_dev;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
230 dotino = st.st_ino;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
231 mount_point = dotdev != thisdev;
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
232
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
233 /* 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
234 #ifdef AT_FDCWD
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
235 dirstream = fdopendir (fd);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
236 if (dirstream == NULL)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
237 goto lose;
8202
b0e0eba8a254 Don't use FD after a successful "fdopendir (fd)".
Jim Meyering <jim@meyering.net>
parents: 8199
diff changeset
238 /* Reset fd. It may have been closed by fdopendir. */
b0e0eba8a254 Don't use FD after a successful "fdopendir (fd)".
Jim Meyering <jim@meyering.net>
parents: 8199
diff changeset
239 fd = dirfd (dirstream);
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
240 fd_needs_closing = false;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
241 #else
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
242 dirstream = __opendir (dotlist);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
243 if (dirstream == NULL)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
244 goto lose;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
245 dotlist[dotlen++] = '/';
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
246 #endif
6439
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
247 for (;;)
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
248 {
6439
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
249 /* 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
250 NULL. */
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
251 __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
252 d = __readdir (dirstream);
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
253
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
254 /* When we've iterated through all directory entries without finding
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
255 one with a matching d_ino, rewind the stream and consider each
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
256 name again, but this time, using lstat. This is necessary in a
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
257 chroot on at least one system (glibc-2.3.6 + linux 2.6.12), where
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
258 .., ../.., ../../.., etc. all had the same device number, yet the
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
259 d_ino values for entries in / did not match those obtained
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
260 via lstat. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
261 if (d == NULL && errno == 0 && use_d_ino)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
262 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
263 use_d_ino = false;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
264 rewinddir (dirstream);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
265 d = __readdir (dirstream);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
266 }
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
267
6439
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
268 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
269 {
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
270 if (errno == 0)
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
271 /* EOF on dirstream, which can mean e.g., that the current
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
272 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
273 __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
274 goto lose;
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
275 }
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
276 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
277 (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
278 (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
279 continue;
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
280
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
281 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
282 {
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
283 bool match = (MATCHING_INO (d, thisino) || mount_point);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
284 if (! match)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
285 continue;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
286 }
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
287
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
288 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
289 int entry_status;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
290 #ifdef AT_FDCWD
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
291 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
292 #else
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
293 /* Compute size needed for this file name, or for the file
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
294 name ".." in the same directory, whichever is larger.
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
295 Room for ".." might be needed the next time through
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
296 the outer loop. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
297 size_t name_alloc = _D_ALLOC_NAMLEN (d);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
298 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
299
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
300 if (filesize < dotlen)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
301 goto memory_exhausted;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
302
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
303 if (dotsize < filesize)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
304 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
305 /* My, what a deep directory tree you have, Grandma. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
306 size_t newsize = MAX (filesize, dotsize * 2);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
307 size_t i;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
308 if (newsize < dotsize)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
309 goto memory_exhausted;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
310 if (dotlist != dots)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
311 free (dotlist);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
312 dotlist = malloc (newsize);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
313 if (dotlist == NULL)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
314 goto lose;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
315 dotsize = newsize;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
316
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
317 i = 0;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
318 do
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
319 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
320 dotlist[i++] = '.';
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
321 dotlist[i++] = '.';
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
322 dotlist[i++] = '/';
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
323 }
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
324 while (i < dotlen);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
325 }
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
326
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
327 memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
328 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
329 #endif
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
330 /* We don't fail here if we cannot stat() a directory entry.
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
331 This can happen when (network) file systems fail. If this
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
332 entry is in fact the one we are looking for we will find
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
333 out soon as we reach the end of the directory without
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
334 having found anything. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
335 if (entry_status == 0 && S_ISDIR (st.st_mode)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
336 && st.st_dev == thisdev && st.st_ino == thisino)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
337 break;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
338 }
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
339 }
6439
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
340
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
341 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
342 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
343
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
344 if (dirroom <= namlen)
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
345 {
6439
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
346 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
347 {
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
348 __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
349 goto lose;
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
350 }
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
351 else
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 char *tmp;
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
354 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
355
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
356 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
357 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
358 || ! (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
359 goto memory_exhausted;
5491
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 /* 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
362 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
363 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
364 tmp + dirroom,
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
365 oldsize - dirroom);
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
366 dir = tmp;
5491
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 }
6439
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
369 dirp -= namlen;
3fd547210013 * getcwd.c (__getcwd): Don't assume that system calls after readdir
Paul Eggert <eggert@cs.ucla.edu>
parents: 6305
diff changeset
370 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
371 *--dirp = '/';
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
372
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
373 thisdev = dotdev;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
374 thisino = dotino;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
375 }
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
376
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
377 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
378 {
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
379 dirstream = NULL;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
380 goto lose;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
381 }
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
382
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
383 if (dirp == &dir[allocated - 1])
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
384 *--dirp = '/';
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
385
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
386 #ifndef AT_FDCWD
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
387 if (dotlist != dots)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
388 free (dotlist);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
389 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
390
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
391 used = dir + allocated - dirp;
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
392 memmove (dir, dirp, used);
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
393
8474
11ae25a37675 * lib/getcwd.c (__getcwd): Remove redundant comparison of buf to NULL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 8217
diff changeset
394 if (size == 0)
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
395 /* Ensure that the buffer is only as large as necessary. */
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
396 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
397
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
398 if (buf == NULL)
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
399 /* 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
400 we still have the original string. */
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
401 buf = dir;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
402
5499
41fd04e6a198 (is_ENAMETOOLONG): New macro.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5491
diff changeset
403 return buf;
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
404
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
405 memory_exhausted:
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
406 __set_errno (ENOMEM);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
407 lose:
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
408 {
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
409 int save = errno;
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
410 if (dirstream)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
411 __closedir (dirstream);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
412 #ifdef AT_FDCWD
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
413 if (fd_needs_closing)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
414 close (fd);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
415 #else
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
416 if (dotlist != dots)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
417 free (dotlist);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
418 #endif
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
419 if (buf == NULL)
5907
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
420 free (dir);
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
421 __set_errno (save);
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
422 }
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
423 return NULL;
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
424 }
5491
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
425
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
426 #ifdef weak_alias
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
427 weak_alias (__getcwd, getcwd)
b3d5c90efc81 Merge from coreutils for getcwd and HP-UX 11.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5136
diff changeset
428 #endif