Home | History | Annotate | Download | only in m4
      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 
     11 AC_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>
     51 int 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>
     64 int 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.
    134 AC_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