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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
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
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
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
137 char *dir;
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
151 dir = getcwd (buf, size);
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
152 if (dir || (errno != ERANGE && !is_ENAMETOOLONG (errno) && errno != ENOENT))
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
169 dir = malloc (allocated);
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
176 dirp = dir + allocated;
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
245
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
246 /* When we've iterated through all directory entries without finding
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
247 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
248 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
249 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
250 .., ../.., ../../.., etc. all had the same device number, yet the
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
251 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
252 via lstat. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
253 if (d == NULL && errno == 0 && use_d_ino)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
254 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
255 use_d_ino = false;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
256 rewinddir (dirstream);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
257 d = __readdir (dirstream);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
258 }
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
263 /* 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
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
272
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
275 bool match = (MATCHING_INO (d, thisino) || mount_point);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
276 if (! match)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
277 continue;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
278 }
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
279
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 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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
285 /* 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
286 name ".." in the same directory, whichever is larger.
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
287 Room for ".." might be needed the next time through
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
288 the outer loop. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
289 size_t name_alloc = _D_ALLOC_NAMLEN (d);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
292 if (filesize < dotlen)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
295 if (dotsize < filesize)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
296 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
297 /* My, what a deep directory tree you have, Grandma. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
298 size_t newsize = MAX (filesize, dotsize * 2);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
299 size_t i;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
300 if (newsize < dotsize)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
301 goto memory_exhausted;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
302 if (dotlist != dots)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
303 free (dotlist);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
304 dotlist = malloc (newsize);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
305 if (dotlist == NULL)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
306 goto lose;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
309 i = 0;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
310 do
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
311 {
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
312 dotlist[i++] = '.';
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
313 dotlist[i++] = '.';
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
314 dotlist[i++] = '/';
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
315 }
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
316 while (i < dotlen);
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
317 }
5136
3d7c80bdf362 New getcwd module, imported from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
318
6912
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
319 memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
322 /* 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
323 This can happen when (network) file systems fail. If this
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
324 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
325 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
326 having found anything. */
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
327 if (entry_status == 0 && S_ISDIR (st.st_mode)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
328 && st.st_dev == thisdev && st.st_ino == thisino)
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
329 break;
314715e0260d Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6647
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
375 if (dirp == &dir[allocated - 1])
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
383 used = dir + allocated - dirp;
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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
c47674a83a78 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5848
diff changeset
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