acl.m4 7.28 KB
Newer Older
1
# acl.m4 - check for access control list (ACL) primitives
Paul Eggert's avatar
Paul Eggert committed
2
# serial 21
3

4
# Copyright (C) 2002, 2004-2015 Free Software Foundation, Inc.
5 6 7 8 9 10
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# Written by Paul Eggert and Jim Meyering.

Paul Eggert's avatar
Paul Eggert committed
11
AC_DEFUN([gl_FUNC_ACL_ARG],
12
[
Paul Eggert's avatar
Paul Eggert committed
13
  gl_need_lib_has_acl=
14 15 16
  AC_ARG_ENABLE([acl],
    AS_HELP_STRING([--disable-acl], [do not support ACLs]),
    , [enable_acl=auto])
Paul Eggert's avatar
Paul Eggert committed
17 18
])

19

Paul Eggert's avatar
Paul Eggert committed
20 21 22
AC_DEFUN([gl_FUNC_ACL],
[
  AC_REQUIRE([gl_FUNC_ACL_ARG])
Paul Eggert's avatar
Paul Eggert committed
23
  AC_CHECK_FUNCS_ONCE([fchmod])
24 25
  LIB_ACL=
  use_acl=0
Paul Eggert's avatar
Paul Eggert committed
26
  if test "$enable_acl" != no; then
27 28 29 30 31
    dnl On all platforms, the ACL related API is declared in <sys/acl.h>.
    AC_CHECK_HEADERS([sys/acl.h])
    if test $ac_cv_header_sys_acl_h = yes; then
      ac_save_LIBS=$LIBS

Paul Eggert's avatar
Paul Eggert committed
32 33
      dnl Test for POSIX-draft-like API (GNU/Linux, FreeBSD, Mac OS X,
      dnl IRIX, Tru64).  -lacl is needed on GNU/Linux, -lpacl on OSF/1.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
      if test $use_acl = 0; then
        AC_SEARCH_LIBS([acl_get_file], [acl pacl],
          [if test "$ac_cv_search_acl_get_file" != "none required"; then
             LIB_ACL=$ac_cv_search_acl_get_file
           fi
           AC_CHECK_FUNCS(
             [acl_get_file acl_get_fd acl_set_file acl_set_fd \
              acl_free acl_from_mode acl_from_text \
              acl_delete_def_file acl_extended_file \
              acl_delete_fd_np acl_delete_file_np \
              acl_copy_ext_native acl_create_entry_np \
              acl_to_short_text acl_free_text])
           # If the acl_get_file bug is detected, don't enable the ACL support.
           gl_ACL_GET_FILE([use_acl=1], [])
           if test $use_acl = 1; then
Paul Eggert's avatar
Paul Eggert committed
49
             dnl On GNU/Linux, an additional API is declared in <acl/libacl.h>.
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
             AC_CHECK_HEADERS([acl/libacl.h])
             AC_REPLACE_FUNCS([acl_entries])
             AC_CACHE_CHECK([for ACL_FIRST_ENTRY],
               [gl_cv_acl_ACL_FIRST_ENTRY],
               [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[#include <sys/types.h>
#include <sys/acl.h>
int type = ACL_FIRST_ENTRY;]])],
                  [gl_cv_acl_ACL_FIRST_ENTRY=yes],
                  [gl_cv_acl_ACL_FIRST_ENTRY=no])])
             if test $gl_cv_acl_ACL_FIRST_ENTRY = yes; then
               AC_DEFINE([HAVE_ACL_FIRST_ENTRY], [1],
                 [Define to 1 if the constant ACL_FIRST_ENTRY exists.])
             fi
             dnl On Mac OS X, other types of ACLs are supported.
             AC_CACHE_CHECK([for ACL_TYPE_EXTENDED],
               [gl_cv_acl_ACL_TYPE_EXTENDED],
               [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[#include <sys/types.h>
#include <sys/acl.h>
int type = ACL_TYPE_EXTENDED;]])],
                  [gl_cv_acl_ACL_TYPE_EXTENDED=yes],
                  [gl_cv_acl_ACL_TYPE_EXTENDED=no])])
             if test $gl_cv_acl_ACL_TYPE_EXTENDED = yes; then
               AC_DEFINE([HAVE_ACL_TYPE_EXTENDED], [1],
                 [Define to 1 if the ACL type ACL_TYPE_EXTENDED exists.])
             fi
           else
             LIB_ACL=
           fi
          ])
      fi

      dnl Test for Solaris API (Solaris, Cygwin).
      if test $use_acl = 0; then
        AC_CHECK_FUNCS([facl])
        if test $ac_cv_func_facl = yes; then
          AC_SEARCH_LIBS([acl_trivial], [sec],
            [if test "$ac_cv_search_acl_trivial" != "none required"; then
               LIB_ACL=$ac_cv_search_acl_trivial
             fi
            ])
          AC_CHECK_FUNCS([acl_trivial])
          use_acl=1
        fi
      fi

      dnl Test for HP-UX API.
      if test $use_acl = 0; then
        AC_CHECK_FUNCS([getacl])
        if test $ac_cv_func_getacl = yes; then
          use_acl=1
        fi
        dnl Test for HP-UX 11.11 API.
        AC_CHECK_HEADERS([aclv.h], [], [], [#include <sys/types.h>])
      fi

      dnl Test for AIX API (AIX 5.3 or newer).
      if test $use_acl = 0; then
        AC_CHECK_FUNCS([aclx_get])
        if test $ac_cv_func_aclx_get = yes; then
          use_acl=1
        fi
      fi

      dnl Test for older AIX API.
      if test $use_acl = 0 || test "$ac_cv_func_aclx_get" = yes; then
        AC_CHECK_FUNCS([statacl])
        if test $ac_cv_func_statacl = yes; then
          use_acl=1
        fi
      fi

      dnl Test for NonStop Kernel API.
      if test $use_acl = 0; then
        AC_CHECK_FUNCS([aclsort])
        if test $ac_cv_func_aclsort = yes; then
          use_acl=1
        fi
      fi

      LIBS=$ac_save_LIBS
    fi
Paul Eggert's avatar
Paul Eggert committed
133 134

    if test "$enable_acl$use_acl" = yes0; then
135
      AC_MSG_ERROR([ACLs enabled but support not detected])
Paul Eggert's avatar
Paul Eggert committed
136
    elif test "$enable_acl$use_acl" = auto0; then
137 138 139 140
      AC_MSG_WARN([libacl development library was not found or not usable.])
      AC_MSG_WARN([AC_PACKAGE_NAME will be built without ACL support.])
    fi
  fi
Paul Eggert's avatar
Paul Eggert committed
141
  test $gl_need_lib_has_acl && LIB_HAS_ACL=$LIB_ACL
142 143 144 145 146 147 148 149
  AC_SUBST([LIB_ACL])
  AC_DEFINE_UNQUOTED([USE_ACL], [$use_acl],
    [Define to nonzero if you want access control list support.])
  USE_ACL=$use_acl
  AC_SUBST([USE_ACL])
])

# gl_ACL_GET_FILE(IF-WORKS, IF-NOT)
Paul Eggert's avatar
Paul Eggert committed
150
# ---------------------------------
151 152
# If 'acl_get_file' works (does not have a particular bug),
# run IF-WORKS, otherwise, IF-NOT.
Paul Eggert's avatar
Paul Eggert committed
153 154 155
# When building natively, test for a Darwin 8.7.0 bug, whereby acl_get_file
# returns NULL, but sets errno = ENOENT for an existing file or directory.
# When cross-compiling, assume that this old bug no longer applies.
156 157 158
AC_DEFUN([gl_ACL_GET_FILE],
[
  AC_CACHE_CHECK([for working acl_get_file], [gl_cv_func_working_acl_get_file],
Paul Eggert's avatar
Paul Eggert committed
159 160
    [gl_cv_func_working_acl_get_file=no
     AC_LINK_IFELSE(
161 162 163 164 165 166 167 168 169
       [AC_LANG_PROGRAM(
          [[#include <sys/types.h>
           #include <sys/acl.h>
           #include <errno.h>
          ]],
          [[if (!acl_get_file (".", ACL_TYPE_ACCESS) && errno == ENOENT)
              return 1;
            return 0;
          ]])],
Paul Eggert's avatar
Paul Eggert committed
170 171 172 173 174 175
       [if test $cross_compiling = yes; then
          gl_cv_func_working_acl_get_file="guessing yes"
        elif ./conftest$ac_exeext; then
          gl_cv_func_working_acl_get_file=yes
        fi])])
  AS_IF([test "$gl_cv_func_working_acl_get_file" != no], [$1], [$2])
176
])
Paul Eggert's avatar
Paul Eggert committed
177 178 179 180 181 182 183

# On GNU/Linux, testing if a file has an acl can be done with the getxattr
# syscall which doesn't require linking against additional libraries.
AC_DEFUN([gl_FILE_HAS_ACL],
[
  AC_REQUIRE([gl_FUNC_ACL_ARG])
  if test "$enable_acl" != no; then
Paul Eggert's avatar
Paul Eggert committed
184 185 186 187 188 189 190 191 192 193 194 195 196 197
    AC_CACHE_CHECK([for getxattr with XATTR_NAME_POSIX_ACL macros],
      [gl_cv_getxattr_with_posix_acls],
      [gl_cv_getxattr_with_posix_acls=no
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <sys/types.h>
              #include <sys/xattr.h>
              #include <linux/xattr.h>
            ]],
            [[ssize_t a = getxattr (".", XATTR_NAME_POSIX_ACL_ACCESS, 0, 0);
              ssize_t b = getxattr (".", XATTR_NAME_POSIX_ACL_DEFAULT, 0, 0);
              return a < 0 || b < 0;
            ]])],
         [gl_cv_getxattr_with_posix_acls=yes])])
Paul Eggert's avatar
Paul Eggert committed
198
  fi
Paul Eggert's avatar
Paul Eggert committed
199
  if test "$gl_cv_getxattr_with_posix_acls" = yes; then
Paul Eggert's avatar
Paul Eggert committed
200
    LIB_HAS_ACL=
Paul Eggert's avatar
Paul Eggert committed
201 202 203
    AC_DEFINE([GETXATTR_WITH_POSIX_ACLS], 1,
      [Define to 1 if getxattr works with XATTR_NAME_POSIX_ACL_ACCESS
       and XATTR_NAME_POSIX_ACL_DEFAULT.])
Paul Eggert's avatar
Paul Eggert committed
204 205 206 207 208 209 210 211
  else
    dnl Set gl_need_lib_has_acl to a nonempty value, so that any
    dnl later gl_FUNC_ACL call will set LIB_HAS_ACL=$LIB_ACL.
    gl_need_lib_has_acl=1
    LIB_HAS_ACL=$LIB_ACL
  fi
  AC_SUBST([LIB_HAS_ACL])
])