[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnulib getcwd patch needed for Solaris 10 getcwd
From: |
Paul Eggert |
Subject: |
gnulib getcwd patch needed for Solaris 10 getcwd |
Date: |
Wed, 21 Feb 2007 00:40:38 -0800 |
User-agent: |
Gnus/5.1008 (Gnus v5.10.8) Emacs/21.4 (gnu/linux) |
coreutils "make check" failed on Solaris 10 with Sun C 5.8 due to "df
." failing. I tracked it down to a getcwd issue exposed by recent
changes to getcwd.c, and installed this patch to gnulib.
After installing this patch (and the other fixes I sent in just now),
"make check" succeeded on this platform.
2007-02-21 Paul Eggert <address@hidden>
* lib/getcwd.c (__getcwd): Don't assume getcwd (NULL, 0) works
like glibc; on Solaris 10, it fails with errno == EINVAL.
POSIX says the behavior is unspecified if the first argument is NULL,
so play it safe and never pass NULL to the system getcwd.
--- lib/getcwd.c 21 Feb 2007 07:54:16 -0000 1.21
+++ lib/getcwd.c 21 Feb 2007 08:36:32 -0000
@@ -141,24 +141,6 @@ __getcwd (char *buf, size_t size)
size_t allocated = size;
size_t used;
-#if HAVE_PARTLY_WORKING_GETCWD
- /* The system getcwd works, except it sometimes fails when it
- shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If
- AT_FDCWD is not defined, the algorithm below is O(N**2) and this
- is much slower than the system getcwd (at least on GNU/Linux).
- So trust the system getcwd's results unless they look
- suspicious.
-
- Use the system getcwd even if we have openat support, since the
- system getcwd works even when a parent is unreadable, while the
- openat-based approach does not. */
-
-# undef getcwd
- dir = getcwd (buf, size);
- if (dir || (errno != ERANGE && !is_ENAMETOOLONG (errno) && errno != ENOENT))
- return dir;
-#endif
-
if (size == 0)
{
if (buf != NULL)
@@ -179,6 +161,30 @@ __getcwd (char *buf, size_t size)
else
dir = buf;
+#if HAVE_PARTLY_WORKING_GETCWD
+ /* The system getcwd works, except it sometimes fails when it
+ shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If
+ AT_FDCWD is not defined, the algorithm below is O(N**2) and this
+ is much slower than the system getcwd (at least on GNU/Linux).
+ So trust the system getcwd's results unless they look
+ suspicious.
+
+ Use the system getcwd even if we have openat support, since the
+ system getcwd works even when a parent is unreadable, while the
+ openat-based approach does not. */
+
+# undef getcwd
+ if (getcwd (dir, allocated))
+ {
+ if (buf == NULL && size == 0)
+ buf = realloc (dir, strlen (dir) + 1);
+ return (buf ? buf : dir);
+ }
+
+ if (! (errno == ERANGE || is_ENAMETOOLONG (errno) || errno == ENOENT))
+ return NULL;
+#endif
+
dirp = dir + allocated;
*--dirp = '\0';
- gnulib getcwd patch needed for Solaris 10 getcwd,
Paul Eggert <=