link-follow: accomodate mingw and cross-compilation
authorEric Blake <ebb9@byu.net>
Fri, 4 Sep 2009 17:49:02 +0000 (11:49 -0600)
committerEric Blake <ebb9@byu.net>
Fri, 4 Sep 2009 17:59:09 +0000 (11:59 -0600)
* m4/link-follow.m4 (gl_AC_FUNC_LINK_FOLLOWS_SYMLINK): Rename...
(gl_FUNC_LINK_FOLLOWS_SYMLINK): ...to this.  Change
cross-compilation results to -1, to make linkat easier to
implement when cross-compiling.  Trivially support mingw.
* modules/link-follow (configure.ac): Call new name.
* NEWS: Mention this.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
NEWS
m4/link-follow.m4
modules/link-follow

index 58a4b35..e63d09e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-09-04  Eric Blake  <ebb9@byu.net>
+
+       link-follow: accomodate mingw and cross-compilation
+       * m4/link-follow.m4 (gl_AC_FUNC_LINK_FOLLOWS_SYMLINK): Rename...
+       (gl_FUNC_LINK_FOLLOWS_SYMLINK): ...to this.  Change
+       cross-compilation results to -1, to make linkat easier to
+       implement when cross-compiling.  Trivially support mingw.
+       * modules/link-follow (configure.ac): Call new name.
+       * NEWS: Mention this.
+
 2009-09-03  Eric Blake  <ebb9@byu.net>
 
        faccessat: compile replacement
diff --git a/NEWS b/NEWS
index 4cd0278..f506cba 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ User visible incompatible changes
 
 Date        Modules         Changes
 
+2009-09-04  link-follow     The macro LINK_FOLLOWS_SYMLINK is now tri-state,
+                            rather than only defined to 1.
+
 2009-09-03  openat          The include files are standardized to POSIX 2008.
                             For openat, include <fcntl.h>; for
                             fchmodat, fstatat, and mkdirat, include
index 0c1ea36..eb98c3b 100644 (file)
@@ -1,4 +1,4 @@
-# serial 12
+# serial 13
 dnl Run a program to determine whether link(2) follows symlinks.
 dnl Set LINK_FOLLOWS_SYMLINKS accordingly.
 
@@ -7,14 +7,27 @@ dnl Set LINK_FOLLOWS_SYMLINKS accordingly.
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_AC_FUNC_LINK_FOLLOWS_SYMLINK],
+dnl This macro can be used to emulate POSIX linkat.  If
+dnl LINK_FOLLOWS_SYMLINKS is 0, link matches linkat(,0), and
+dnl linkat(,AT_SYMLINK_FOLLOW) requires a readlink. If it is 1,
+dnl link matches linkat(,AT_SYMLINK_FOLLOW), and there is no way
+dnl to do linkat(,0) on symlinks (on all other file types,
+dnl link() is sufficient).  If it is -1, use a runtime test.
+AC_DEFUN([gl_FUNC_LINK_FOLLOWS_SYMLINK],
 [dnl
-  AC_CACHE_CHECK([whether link(2) dereferences a symlink],
-                gl_ac_cv_func_link_follows_symlink,
-  [
-    # Create a regular file.
-    echo > conftest.file
-    AC_RUN_IFELSE([AC_LANG_SOURCE([[
+  AC_CHECK_FUNCS_ONCE([readlink])
+  dnl Mingw lacks link, although gnulib provides a good replacement.
+  dnl However, it also lacks symlink, so there's nothing to test in
+  dnl the first place, and no reason to need to distinguish between
+  dnl linkat variants.  So, we set LINK_FOLLOWS_SYMLINKS to 0.
+  gl_link_follows_symlinks=0 # assume GNU behavior
+  if test $ac_cv_func_readlink = yes; then
+    AC_CACHE_CHECK([whether link(2) dereferences a symlink],
+                   gl_cv_func_link_follows_symlink,
+    [
+      # Create a regular file.
+      echo > conftest.file
+      AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #       include <sys/types.h>
 #       include <sys/stat.h>
 #       include <unistd.h>
@@ -50,13 +63,18 @@ AC_DEFUN([gl_AC_FUNC_LINK_FOLLOWS_SYMLINK],
          return SAME_INODE (sb_hard, sb_file) ? 0 : 1;
        }
       ]])],
-      [gl_ac_cv_func_link_follows_symlink=yes],
-      [gl_ac_cv_func_link_follows_symlink=no],
-      [gl_ac_cv_func_link_follows_symlink=yes] dnl We're cross compiling.
-    )
-  ])
-  if test $gl_ac_cv_func_link_follows_symlink = yes; then
-    AC_DEFINE([LINK_FOLLOWS_SYMLINKS], [1],
-      [Define if `link(2)' dereferences symbolic links.])
+       [gl_cv_func_link_follows_symlink=yes],
+       [gl_cv_func_link_follows_symlink=no],
+       [gl_cv_func_link_follows_symlink=unknown] dnl We're cross compiling.
+      )
+    ])
+    case $gl_cv_func_link_follows_symlink in
+      yes) ;;
+      no) gl_link_follows_symlinks=1 ;;
+      *) gl_link_follows_symlinks=-1 ;;
+    esac
   fi
+  AC_DEFINE_UNQUOTED([LINK_FOLLOWS_SYMLINKS], [$gl_link_follows_symlinks],
+    [Define to 1 if `link(2)' dereferences symbolic links, 0 if it
+     creates hard links to symlinks, and -1 if unknown.])
 ])
index 15a19f4..c7fd48a 100644 (file)
@@ -7,7 +7,7 @@ m4/link-follow.m4
 Depends-on:
 
 configure.ac:
-gl_AC_FUNC_LINK_FOLLOWS_SYMLINK
+gl_FUNC_LINK_FOLLOWS_SYMLINK
 
 Makefile.am: