X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fchown.m4;h=ac76d3fe2bc517b0a2b94bb6e5da8d710b437e3a;hb=16685f16dd4a1a691ae6807eeb12f7c586669003;hp=73ae469c34251449940f7a2aed13ff11c36c3756;hpb=e62d4d88ece0086446631e65b3f647d9696b04c3;p=gnulib.git diff --git a/m4/chown.m4 b/m4/chown.m4 index 73ae469c3..ac76d3fe2 100644 --- a/m4/chown.m4 +++ b/m4/chown.m4 @@ -1,49 +1,84 @@ -#serial 4 - -dnl From Jim Meyering. -dnl Determine whether chown accepts arguments of -1 for uid and gid. -dnl If it doesn't, arrange to use the replacement function. -dnl - -AC_DEFUN(jm_FUNC_CHOWN, -[AC_REQUIRE([AC_TYPE_UID_T])dnl - test -z "$ac_cv_header_unistd_h" \ - && AC_CHECK_HEADERS(unistd.h) - AC_CACHE_CHECK([for working chown], jm_cv_func_working_chown, - [AC_TRY_RUN([ -# include -# include -# include -# ifdef HAVE_UNISTD_H -# include -# endif - - int - main () - { - char *f = "conftestchown"; - struct stat before, after; - - if (creat (f, 0600) < 0) - exit (1); - if (stat (f, &before) < 0) - exit (1); - if (chown (f, (uid_t) -1, (gid_t) -1) == -1) - exit (1); - if (stat (f, &after) < 0) - exit (1); - exit ((before.st_uid == after.st_uid - && before.st_gid == after.st_gid) ? 0 : 1); - } - ], - jm_cv_func_working_chown=yes, - jm_cv_func_working_chown=no, - dnl When crosscompiling, assume chown is broken. - jm_cv_func_working_chown=no) - ]) - if test $jm_cv_func_working_chown = no; then - LIBOBJS="$LIBOBJS chown.$ac_objext" - AC_DEFINE_UNQUOTED(chown, rpl_chown, - [Define to rpl_chown if the replacement function should be used.]) +# serial 19 +# Determine whether we need the chown wrapper. + +dnl Copyright (C) 1997-2001, 2003-2005, 2007, 2009 +dnl Free Software Foundation, Inc. + +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# chown should accept arguments of -1 for uid and gid, and it should +# dereference symlinks. If it doesn't, arrange to use the replacement +# function. + +# From Jim Meyering. + +AC_DEFUN([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_CHECK_FUNCS_ONCE([chown]) + + if test $ac_cv_func_chown_works = no; then + AC_DEFINE([CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE], [1], + [Define if chown is not POSIX compliant regarding IDs of -1.]) + fi + + # If chown has either of the above problems, then we need the wrapper. + if test $ac_cv_func_chown_works$gl_cv_func_chown_follows_symlink = yesyes; then + : # no wrapper needed + else + REPLACE_CHOWN=1 + AC_LIBOBJ([chown]) + gl_PREREQ_CHOWN fi ]) + +# Determine whether chown follows symlinks (it should). +AC_DEFUN([gl_FUNC_CHOWN_FOLLOWS_SYMLINK], +[ + AC_CACHE_CHECK( + [whether chown(2) dereferences symlinks], + gl_cv_func_chown_follows_symlink, + [ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + + int + main () + { + char const *dangling_symlink = "conftest.dangle"; + + unlink (dangling_symlink); + if (symlink ("conftest.no-such", dangling_symlink)) + abort (); + + /* Exit successfully on a conforming system, + i.e., where chown must fail with ENOENT. */ + exit ( ! (chown (dangling_symlink, getuid (), getgid ()) != 0 + && errno == ENOENT)); + } + ]])], + [gl_cv_func_chown_follows_symlink=yes], + [gl_cv_func_chown_follows_symlink=no], + [gl_cv_func_chown_follows_symlink=yes] + ) + ] + ) + + if test $gl_cv_func_chown_follows_symlink = no; then + AC_DEFINE([CHOWN_MODIFIES_SYMLINK], [1], + [Define if chown modifies symlinks.]) + fi +]) + +# Prerequisites of lib/chown.c. +AC_DEFUN([gl_PREREQ_CHOWN], +[ + AC_CHECK_FUNC([fchown], , [AC_LIBOBJ([fchown-stub])]) +])