Import upstream version 1.27
[debian/tar] / m4 / chown.m4
index f664e7c57f85cbdde67bbd7a5e02f01aa29bfc49..e5c084db3496e5e148691b5ef0c4b7965f244f6a 100644 (file)
@@ -1,7 +1,7 @@
-# serial 24
+# serial 27
 # Determine whether we need the chown wrapper.
 
-dnl Copyright (C) 1997-2001, 2003-2005, 2007, 2009-2011 Free Software
+dnl Copyright (C) 1997-2001, 2003-2005, 2007, 2009-2013 Free Software
 dnl Foundation, Inc.
 
 dnl This file is free software; the Free Software Foundation
@@ -14,23 +14,72 @@ dnl with or without modifications, as long as this notice is preserved.
 
 # From Jim Meyering.
 
+m4_version_prereq([2.70], [] ,[
+
+# This is taken from the following Autoconf patch:
+# http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9
+AC_DEFUN([AC_FUNC_CHOWN],
+[
+  AC_REQUIRE([AC_TYPE_UID_T])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+  AC_CHECK_HEADERS([unistd.h])
+  AC_CACHE_CHECK([for working chown],
+    [ac_cv_func_chown_works],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [AC_INCLUDES_DEFAULT
+           [#include <fcntl.h>
+          ]],
+          [[
+            char *f = "conftest.chown";
+            struct stat before, after;
+
+            if (creat (f, 0600) < 0)
+              return 1;
+            if (stat (f, &before) < 0)
+              return 1;
+            if (chown (f, (uid_t) -1, (gid_t) -1) == -1)
+              return 1;
+            if (stat (f, &after) < 0)
+              return 1;
+            return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid);
+          ]])
+       ],
+       [ac_cv_func_chown_works=yes],
+       [ac_cv_func_chown_works=no],
+       [case "$host_os" in # ((
+                  # Guess yes on glibc systems.
+          *-gnu*) ac_cv_func_chown_works=yes ;;
+                  # If we don't know, assume the worst.
+          *)      ac_cv_func_chown_works=no ;;
+        esac
+       ])
+     rm -f conftest.chown
+    ])
+  if test $ac_cv_func_chown_works = yes; then
+    AC_DEFINE([HAVE_CHOWN], [1],
+      [Define to 1 if your system has a working `chown' function.])
+  fi
+])# AC_FUNC_CHOWN
+
+])
+
 AC_DEFUN_ONCE([gl_FUNC_CHOWN],
 [
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
   AC_REQUIRE([AC_TYPE_UID_T])
   AC_REQUIRE([AC_FUNC_CHOWN])
   AC_REQUIRE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
   AC_CHECK_FUNCS_ONCE([chown fchown])
 
   dnl mingw lacks chown altogether.
   if test $ac_cv_func_chown = no; then
     HAVE_CHOWN=0
-    AC_LIBOBJ([chown])
   else
     dnl Some old systems treated chown like lchown.
     if test $gl_cv_func_chown_follows_symlink = no; then
       REPLACE_CHOWN=1
-      AC_LIBOBJ([chown])
     fi
 
     dnl Some old systems tried to use uid/gid -1 literally.
@@ -38,7 +87,6 @@ AC_DEFUN_ONCE([gl_FUNC_CHOWN],
       AC_DEFINE([CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE], [1],
         [Define if chown is not POSIX compliant regarding IDs of -1.])
       REPLACE_CHOWN=1
-      AC_LIBOBJ([chown])
     fi
 
     dnl Solaris 9 ignores trailing slash.
@@ -56,14 +104,22 @@ AC_DEFUN_ONCE([gl_FUNC_CHOWN],
         ]])],
         [gl_cv_func_chown_slash_works=yes],
         [gl_cv_func_chown_slash_works=no],
-        [gl_cv_func_chown_slash_works="guessing no"])
+        [case "$host_os" in
+                   # Guess yes on glibc systems.
+           *-gnu*) gl_cv_func_chown_slash_works="guessing yes" ;;
+                   # If we don't know, assume the worst.
+           *)      gl_cv_func_chown_slash_works="guessing no" ;;
+         esac
+        ])
       rm -f conftest.link conftest.file])
-    if test "$gl_cv_func_chown_slash_works" != yes; then
-      AC_DEFINE([CHOWN_TRAILING_SLASH_BUG], [1],
-        [Define to 1 if chown mishandles trailing slash.])
-      REPLACE_CHOWN=1
-      AC_LIBOBJ([chown])
-    fi
+    case "$gl_cv_func_chown_slash_works" in
+      *yes) ;;
+      *)
+        AC_DEFINE([CHOWN_TRAILING_SLASH_BUG], [1],
+          [Define to 1 if chown mishandles trailing slash.])
+        REPLACE_CHOWN=1
+        ;;
+    esac
 
     dnl OpenBSD fails to update ctime if ownership does not change.
     AC_CACHE_CHECK([whether chown always updates ctime],
@@ -84,18 +140,22 @@ AC_DEFUN_ONCE([gl_FUNC_CHOWN],
         ]])],
         [gl_cv_func_chown_ctime_works=yes],
         [gl_cv_func_chown_ctime_works=no],
-        [gl_cv_func_chown_ctime_works="guessing no"])
+        [case "$host_os" in
+                   # Guess yes on glibc systems.
+           *-gnu*) gl_cv_func_chown_ctime_works="guessing yes" ;;
+                   # If we don't know, assume the worst.
+           *)      gl_cv_func_chown_ctime_works="guessing no" ;;
+         esac
+        ])
       rm -f conftest.file])
-    if test "$gl_cv_func_chown_ctime_works" != yes; then
-      AC_DEFINE([CHOWN_CHANGE_TIME_BUG], [1], [Define to 1 if chown fails
-        to change ctime when at least one argument was not -1.])
-      REPLACE_CHOWN=1
-      AC_LIBOBJ([chown])
-    fi
-
-    if test $REPLACE_CHOWN = 1 && test $ac_cv_func_fchown = no; then
-      AC_LIBOBJ([fchown-stub])
-    fi
+    case "$gl_cv_func_chown_ctime_works" in
+      *yes) ;;
+      *)
+        AC_DEFINE([CHOWN_CHANGE_TIME_BUG], [1], [Define to 1 if chown fails
+          to change ctime when at least one argument was not -1.])
+        REPLACE_CHOWN=1
+        ;;
+    esac
   fi
 ])