X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=m4%2Fchown.m4;h=633ea3abefc6b92b91243be34be1e8a1e09a7f1b;hb=d30babc23b4f25be970ada2e63a50220a3672281;hp=0c32fa39ff623c068bd5ecb3d5d1927c0acbf12d;hpb=22f1eb8bc17e5be72dd23d42d6aaa60196ac22e6;p=debian%2Ftar diff --git a/m4/chown.m4 b/m4/chown.m4 index 0c32fa39..633ea3ab 100644 --- a/m4/chown.m4 +++ b/m4/chown.m4 @@ -1,7 +1,7 @@ -# serial 22 +# serial 27 # Determine whether we need the chown wrapper. -dnl Copyright (C) 1997-2001, 2003-2005, 2007, 2009-2010 Free Software +dnl Copyright (C) 1997-2001, 2003-2005, 2007, 2009-2015 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 + ]], + [[ + 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,11 +87,11 @@ 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. dnl FreeBSD 7.2 mishandles trailing slash on symlinks. + dnl Likewise for AIX 7.1. AC_CACHE_CHECK([whether chown honors trailing slash], [gl_cv_func_chown_slash_works], [touch conftest.file && rm -f conftest.link @@ -55,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], @@ -83,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 ]) @@ -113,6 +174,7 @@ AC_DEFUN_ONCE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK], int main () { + int result = 0; char const *dangling_symlink = "conftest.dangle"; unlink (dangling_symlink); @@ -121,8 +183,11 @@ AC_DEFUN_ONCE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK], /* Exit successfully on a conforming system, i.e., where chown must fail with ENOENT. */ - exit ( ! (chown (dangling_symlink, getuid (), getgid ()) != 0 - && errno == ENOENT)); + if (chown (dangling_symlink, getuid (), getgid ()) == 0) + result |= 1; + if (errno != ENOENT) + result |= 2; + return result; } ]])], [gl_cv_func_chown_follows_symlink=yes],