bug-gnulib
[Top][All Lists]
Advanced

[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';





reply via email to

[Prev in Thread] Current Thread [Next in Thread]