1#serial 17 2# Determine whether we need the chown wrapper. 3 4dnl Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007 Free 5dnl Software Foundation, Inc. 6 7dnl This file is free software; the Free Software Foundation 8dnl gives unlimited permission to copy and/or distribute it, 9dnl with or without modifications, as long as this notice is preserved. 10 11# chown should accept arguments of -1 for uid and gid, and it should 12# dereference symlinks. If it doesn't, arrange to use the replacement 13# function. 14 15# From Jim Meyering. 16 17AC_DEFUN([gl_FUNC_CHOWN], 18[ 19 AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) 20 AC_REQUIRE([AC_TYPE_UID_T]) 21 AC_REQUIRE([AC_FUNC_CHOWN]) 22 AC_REQUIRE([gl_FUNC_CHOWN_FOLLOWS_SYMLINK]) 23 24 if test $ac_cv_func_chown_works = no; then 25 AC_DEFINE(CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE, 1, 26 [Define if chown is not POSIX compliant regarding IDs of -1.]) 27 fi 28 29 # If chown has either of the above problems, then we need the wrapper. 30 if test $ac_cv_func_chown_works$gl_cv_func_chown_follows_symlink = yesyes; then 31 : # no wrapper needed 32 else 33 REPLACE_CHOWN=1 34 AC_LIBOBJ(chown) 35 gl_PREREQ_CHOWN 36 fi 37]) 38 39# Determine whether chown follows symlinks (it should). 40AC_DEFUN([gl_FUNC_CHOWN_FOLLOWS_SYMLINK], 41[ 42 AC_CACHE_CHECK( 43 [whether chown(2) dereferences symlinks], 44 gl_cv_func_chown_follows_symlink, 45 [ 46 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 47#include <unistd.h> 48#include <stdlib.h> 49#include <errno.h> 50 51 int 52 main () 53 { 54 char const *dangling_symlink = "conftest.dangle"; 55 56 unlink (dangling_symlink); 57 if (symlink ("conftest.no-such", dangling_symlink)) 58 abort (); 59 60 /* Exit successfully on a conforming system, 61 i.e., where chown must fail with ENOENT. */ 62 exit ( ! (chown (dangling_symlink, getuid (), getgid ()) != 0 63 && errno == ENOENT)); 64 } 65 ]])], 66 [gl_cv_func_chown_follows_symlink=yes], 67 [gl_cv_func_chown_follows_symlink=no], 68 [gl_cv_func_chown_follows_symlink=yes] 69 ) 70 ] 71 ) 72 73 if test $gl_cv_func_chown_follows_symlink = no; then 74 AC_DEFINE(CHOWN_MODIFIES_SYMLINK, 1, 75 [Define if chown modifies symlinks.]) 76 fi 77]) 78 79# Prerequisites of lib/chown.c. 80AC_DEFUN([gl_PREREQ_CHOWN], 81[ 82 AC_CHECK_FUNC([fchown], , [AC_LIBOBJ(fchown-stub)]) 83]) 84