canonicalize-lgpl: work around AIX realpath bug
authorEric Blake <eblake@redhat.com>
Mon, 6 Jun 2011 22:17:50 +0000 (16:17 -0600)
committerIan Beckwith <ianb@erislabs.net>
Fri, 10 Jun 2011 00:31:01 +0000 (01:31 +0100)
AIX 7.1 realpath() gets horribly confused by consecutive /
in the name to be resolved.

* m4/canonicalize.m4 (gl_FUNC_REALPATH_WORKS): Expose AIX bug.
* doc/posix-functions/realpath.texi (realpath): Document it.
Reported by Bruno Haible.

Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit c2245238b3d9cc9a367c133065ef675e2f599333)

ChangeLog
doc/posix-functions/realpath.texi
m4/canonicalize.m4

index 3702953..5e21745 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-06-06  Eric Blake  <eblake@redhat.com>
+
+       canonicalize-lgpl: work around AIX realpath bug
+       * m4/canonicalize.m4 (gl_FUNC_REALPATH_WORKS): Expose AIX bug.
+       * doc/posix-functions/realpath.texi (realpath): Document it.
+       Reported by Bruno Haible.
+
 2011-06-06  Bruno Haible  <bruno@clisp.org>
 
        careadlinkat: Avoid mismatch between ssize_t and int.
index cc20709..fd3f160 100644 (file)
@@ -27,6 +27,9 @@ glibc 2.3.5.
 This function fails to recognize non-directories followed @samp{..} on
 some platforms:
 cygwin.
+@item
+This function misbehaves on consecutive slashes on some platforms:
+AIX 7.
 @end itemize
 
 Portability problems not fixed by Gnulib:
index 9a099bd..dffdcc3 100644 (file)
@@ -1,4 +1,4 @@
-# canonicalize.m4 serial 19
+# canonicalize.m4 serial 20
 
 dnl Copyright (C) 2003-2007, 2009-2011 Free Software Foundation, Inc.
 
@@ -62,10 +62,12 @@ AC_DEFUN([gl_FUNC_REALPATH_WORKS],
   AC_CHECK_FUNCS_ONCE([realpath])
   AC_CACHE_CHECK([whether realpath works], [gl_cv_func_realpath_works], [
     touch conftest.a
+    mkdir conftest.d
     AC_RUN_IFELSE([
       AC_LANG_PROGRAM([[
         ]GL_NOCRASH[
         #include <stdlib.h>
+        #include <string.h>
       ]], [[
         int result = 0;
         {
@@ -83,10 +85,17 @@ AC_DEFUN([gl_FUNC_REALPATH_WORKS],
           if (name != NULL)
             result |= 4;
         }
+        {
+          char *name1 = realpath (".", NULL);
+          char *name2 = realpath ("conftest.d//./..", NULL);
+          if (strcmp (name1, name2) != 0)
+            result |= 8;
+        }
         return result;
       ]])
     ], [gl_cv_func_realpath_works=yes], [gl_cv_func_realpath_works=no],
        [gl_cv_func_realpath_works="guessing no"])
+    rm -Rf conftest.a conftest.d
   ])
   if test "$gl_cv_func_realpath_works" = yes; then
     AC_DEFINE([FUNC_REALPATH_WORKS], [1], [Define to 1 if realpath()