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

Paul Eggert's avatar
Paul Eggert committed
4
# Copyright (C) 2002, 2004-2020 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
      dnl Test for POSIX-draft-like API (GNU/Linux, FreeBSD, Mac OS X,
Paul Eggert's avatar
Paul Eggert committed
33 34
      dnl IRIX, Tru64, Cygwin >= 2.5).
      dnl -lacl is needed on GNU/Linux, -lpacl on OSF/1.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
      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
50
             dnl On GNU/Linux, an additional API is declared in <acl/libacl.h>.
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 133
             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
134 135

    if test "$enable_acl$use_acl" = yes0; then
136
      AC_MSG_ERROR([ACLs enabled but support not detected])
Paul Eggert's avatar
Paul Eggert committed
137
    elif test "$enable_acl$use_acl" = auto0; then
138 139 140 141
      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
142
  test -n "$gl_need_lib_has_acl" && LIB_HAS_ACL=$LIB_ACL
143 144 145 146 147 148 149 150
  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
151
# ---------------------------------
152 153
# If 'acl_get_file' works (does not have a particular bug),
# run IF-WORKS, otherwise, IF-NOT.
Paul Eggert's avatar
Paul Eggert committed
154 155 156
# 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.
157 158 159
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
160 161
    [gl_cv_func_working_acl_get_file=no
     AC_LINK_IFELSE(
162 163 164 165 166
       [AC_LANG_PROGRAM(
          [[#include <sys/types.h>
           #include <sys/acl.h>
           #include <errno.h>
          ]],
Paul Eggert's avatar
Paul Eggert committed
167 168
          [[acl_t acl = acl_get_file (".", ACL_TYPE_ACCESS);
            return acl ? acl_free (acl) != 0 : errno == ENOENT;
169
          ]])],
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])
])