1# acl.m4 - check for access control list (ACL) primitives 2# serial 9 3 4# Copyright (C) 2002, 2004-2009 Free Software Foundation, Inc. 5# This file is free software; the Free Software Foundation 6# gives unlimited permission to copy and/or distribute it, 7# with or without modifications, as long as this notice is preserved. 8 9# Written by Paul Eggert and Jim Meyering. 10 11AC_DEFUN([gl_FUNC_ACL], 12[ 13 AC_ARG_ENABLE([acl], 14 AS_HELP_STRING([--disable-acl], [do not support ACLs]), 15 , [enable_acl=auto]) 16 17 LIB_ACL= 18 use_acl=0 19 AC_REQUIRE([AC_C_INLINE]) 20 if test "x$enable_acl" != "xno"; then 21 dnl On all platforms, the ACL related API is declared in <sys/acl.h>. 22 AC_CHECK_HEADERS([sys/acl.h]) 23 if test $ac_cv_header_sys_acl_h = yes; then 24 ac_save_LIBS=$LIBS 25 26 dnl Test for POSIX-draft-like API (Linux, FreeBSD, MacOS X, IRIX, Tru64). 27 dnl -lacl is needed on Linux, -lpacl is needed on OSF/1. 28 if test $use_acl = 0; then 29 AC_SEARCH_LIBS([acl_get_file], [acl pacl], 30 [if test "$ac_cv_search_acl_get_file" != "none required"; then 31 LIB_ACL=$ac_cv_search_acl_get_file 32 fi 33 AC_CHECK_FUNCS( 34 [acl_get_file acl_get_fd acl_set_file acl_set_fd \ 35 acl_free acl_from_mode acl_from_text \ 36 acl_delete_def_file acl_extended_file \ 37 acl_delete_fd_np acl_delete_file_np \ 38 acl_copy_ext_native acl_create_entry_np \ 39 acl_to_short_text acl_free_text]) 40 # If the acl_get_file bug is detected, don't enable the ACL support. 41 gl_ACL_GET_FILE([use_acl=1], []) 42 if test $use_acl = 1; then 43 dnl On Linux, additional API is declared in <acl/libacl.h>. 44 AC_CHECK_HEADERS([acl/libacl.h]) 45 AC_REPLACE_FUNCS([acl_entries]) 46 AC_CACHE_CHECK([for ACL_FIRST_ENTRY], 47 [gl_cv_acl_ACL_FIRST_ENTRY], 48 [AC_COMPILE_IFELSE( 49[[#include <sys/types.h> 50#include <sys/acl.h> 51int type = ACL_FIRST_ENTRY;]], 52 [gl_cv_acl_ACL_FIRST_ENTRY=yes], 53 [gl_cv_acl_ACL_FIRST_ENTRY=no])]) 54 if test $gl_cv_acl_ACL_FIRST_ENTRY = yes; then 55 AC_DEFINE([HAVE_ACL_FIRST_ENTRY], [1], 56 [Define to 1 if the constant ACL_FIRST_ENTRY exists.]) 57 fi 58 dnl On MacOS X, other types of ACLs are supported. 59 AC_CACHE_CHECK([for ACL_TYPE_EXTENDED], 60 [gl_cv_acl_ACL_TYPE_EXTENDED], 61 [AC_COMPILE_IFELSE( 62[[#include <sys/types.h> 63#include <sys/acl.h> 64int type = ACL_TYPE_EXTENDED;]], 65 [gl_cv_acl_ACL_TYPE_EXTENDED=yes], 66 [gl_cv_acl_ACL_TYPE_EXTENDED=no])]) 67 if test $gl_cv_acl_ACL_TYPE_EXTENDED = yes; then 68 AC_DEFINE([HAVE_ACL_TYPE_EXTENDED], [1], 69 [Define to 1 if the ACL type ACL_TYPE_EXTENDED exists.]) 70 fi 71 else 72 LIB_ACL= 73 fi 74 ]) 75 fi 76 77 dnl Test for Solaris API (Solaris, Cygwin). 78 if test $use_acl = 0; then 79 AC_CHECK_FUNCS([acl]) 80 if test $ac_cv_func_acl = yes; then 81 AC_SEARCH_LIBS([acl_trivial], [sec], 82 [if test "$ac_cv_search_acl_trivial" != "none required"; then 83 LIB_ACL=$ac_cv_search_acl_trivial 84 fi 85 ]) 86 AC_CHECK_FUNCS([acl_trivial]) 87 use_acl=1 88 fi 89 fi 90 91 dnl Test for HP-UX API. 92 if test $use_acl = 0 || test "$ac_cv_func_acl" = yes; then 93 AC_CHECK_FUNCS([getacl]) 94 if test $ac_cv_func_getacl = yes; then 95 use_acl=1 96 fi 97 fi 98 99 dnl Test for AIX API (AIX 5.3 or newer). 100 if test $use_acl = 0; then 101 AC_CHECK_FUNCS([aclx_get]) 102 if test $ac_cv_func_aclx_get = yes; then 103 use_acl=1 104 fi 105 fi 106 107 dnl Test for older AIX API. 108 if test $use_acl = 0 || test "$ac_cv_func_aclx_get" = yes; then 109 AC_CHECK_FUNCS([statacl]) 110 if test $ac_cv_func_statacl = yes; then 111 use_acl=1 112 fi 113 fi 114 115 LIBS=$ac_save_LIBS 116 fi 117 if test "x$enable_acl$use_acl" = "xyes0"; then 118 AC_MSG_ERROR([ACLs enabled but support not detected]) 119 fi 120 fi 121 AC_SUBST([LIB_ACL]) 122 AC_DEFINE_UNQUOTED([USE_ACL], [$use_acl], 123 [Define to nonzero if you want access control list support.]) 124 USE_ACL=$use_acl 125 AC_SUBST([USE_ACL]) 126]) 127 128# gl_ACL_GET_FILE(IF-WORKS, IF-NOT) 129# ------------------------------------- 130# If `acl_get_file' works (does not have a particular bug), 131# run IF-WORKS, otherwise, IF-NOT. 132# This tests for a Darwin 8.7.0 bug, whereby acl_get_file returns NULL, 133# but sets errno = ENOENT for an existing file or directory. 134AC_DEFUN([gl_ACL_GET_FILE], 135[ 136 AC_CACHE_CHECK([for working acl_get_file], [gl_cv_func_working_acl_get_file], 137 [AC_RUN_IFELSE( 138 [AC_LANG_PROGRAM( 139 [[#include <sys/types.h> 140 #include <sys/acl.h> 141 #include <errno.h> 142 ]], 143 [[return !! (!acl_get_file (".", ACL_TYPE_ACCESS) 144 && errno == ENOENT);]])], 145 [gl_cv_func_working_acl_get_file=yes], 146 [gl_cv_func_working_acl_get_file=no], 147 [gl_cv_func_working_acl_get_file=cross-compiling])]) 148 149 AS_IF([test $gl_cv_func_working_acl_get_file = yes], [$1], [$2]) 150]) 151