summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <andreas.gruenbacher@gmail.com>2015-04-12 16:36:37 +0200
committerPádraig Brady <P@draigBrady.com>2015-04-15 23:41:39 +0100
commitda6ebc941e966141e83591408545224274d0cf0f (patch)
treed1c12ba3b30d647b9d837378afe5fc7955aeb4e1
parenta09a0344e3282d8b4a927916cf117ba5c1472bdd (diff)
acl: On Linux, check for acls without libacl
On Linux, use the getxattr syscall instead of the acl_extended_file libacl library function to check for the presence of acls, avoiding a library dependency. * lib/file-has-acl.c: Include xattr headers if we have them. (file_has_acl): On Linux, use getxattr(). * m4/acl.m4 (gl_FUNC_ACL): Define LIB_HAS_ACL as the libraries to link with for file_has_acl(). Check for xattr headers and getxattr(). * modules/acl: Add a dep on the stdbool module which was already needed. Add the new reduced dependency LIB_HAS_ACL reference.
-rw-r--r--ChangeLog10
-rw-r--r--NEWS5
-rw-r--r--lib/file-has-acl.c35
-rw-r--r--m4/acl.m417
-rw-r--r--modules/acl2
5 files changed, 68 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 95d49ec..de8cc66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2015-04-15 Andreas Gruenbacher <andreas.gruenbacher@gmail.com>
+
+ acl: On Linux, check for acls without libacl
+ On Linux, use the getxattr syscall instead of the acl_extended_file libacl
+ library function to check for the presence of acls, avoiding a library.
+ * lib/file-has-acl.c: Include xattr headers if we have them.
+ (file_has_acl): On Linux, use getxattr().
+ * m4/acl.m4 (gl_FUNC_ACL): Define LIB_HAS_ACL as the libraries to link with for
+ file_has_acl(). Check for xattr headers and getxattr().
+
2015-04-14 Ángel González <keisial@gmail.com>
tempname: avoid unused parameter warnings (trivial)
diff --git a/NEWS b/NEWS
index ef397ef..fd15999 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,11 @@ Important notes
Date Modules Changes
+2015-04-15 acl If your project only uses the file_has_acl()
+ detection routine, then the requirements are
+ potentially reduced by using $LIB_HAS_ACL rather
+ than $LIB_ACL.
+
2013-04-24 gettext If your project uses 'gettextize --intl' it is now
your responsibility to put -I$(top_builddir)/intl
into the Makefile.am for gnulib.
diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c
index de89a75..5dfe9a8 100644
--- a/lib/file-has-acl.c
+++ b/lib/file-has-acl.c
@@ -29,6 +29,13 @@
#include "acl-internal.h"
+#if HAVE_SYS_XATTR_H
+# include <sys/xattr.h>
+#endif
+
+#if HAVE_LINUX_XATTR_H
+# include <linux/xattr.h>
+#endif
/* Return 1 if NAME has a nontrivial access control list, 0 if NAME
only has no or a base access control list, and -1 (setting errno)
@@ -41,7 +48,33 @@ file_has_acl (char const *name, struct stat const *sb)
#if USE_ACL
if (! S_ISLNK (sb->st_mode))
{
-# if HAVE_ACL_GET_FILE
+
+# if HAVE_GETXATTR && defined XATTR_NAME_POSIX_ACL_ACCESS && defined XATTR_NAME_POSIX_ACL_DEFAULT
+
+ ssize_t ret;
+
+ ret = getxattr (name, XATTR_NAME_POSIX_ACL_ACCESS, NULL, 0);
+ if (ret < 0)
+ {
+ if (errno != ENODATA)
+ return -1;
+ }
+ else if (ret > 0)
+ return 1;
+ if (S_ISDIR (sb->st_mode))
+ {
+ ret = getxattr (name, XATTR_NAME_POSIX_ACL_DEFAULT, NULL, 0);
+ if (ret < 0)
+ {
+ if (errno != ENODATA)
+ return -1;
+ }
+ else if (ret > 0)
+ return 1;
+ }
+ return 0;
+
+# elif HAVE_ACL_GET_FILE
/* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
/* Linux, FreeBSD, Mac OS X, IRIX, Tru64 */
diff --git a/m4/acl.m4 b/m4/acl.m4
index c77f0ed..a6c2a0d 100644
--- a/m4/acl.m4
+++ b/m4/acl.m4
@@ -16,6 +16,7 @@ AC_DEFUN([gl_FUNC_ACL],
AC_CHECK_FUNCS_ONCE([fchmod])
LIB_ACL=
+ LIB_HAS_ACL=
use_acl=0
if test "x$enable_acl" != "xno"; then
dnl On all platforms, the ACL related API is declared in <sys/acl.h>.
@@ -124,6 +125,21 @@ int type = ACL_TYPE_EXTENDED;]])],
LIBS=$ac_save_LIBS
fi
+
+ dnl On Linux, testing if a file has an acl can be done with the getxattr
+ dnl syscall which doesn't require linking against additional libraries.
+ use_xattrs=0
+ AC_CHECK_HEADERS([sys/xattr.h linux/xattr.h])
+ if test $ac_cv_header_sys_xattr_h = yes && test $ac_cv_header_linux_xattr_h = yes; then
+ AC_CHECK_FUNCS([getxattr])
+ if test $ac_cv_func_getxattr = yes; then
+ use_xattrs=1
+ fi
+ fi
+ if test use_xattrs = 0; then
+ LIB_HAS_ACL=$LIB_ACL
+ fi
+
if test "x$enable_acl$use_acl" = "xyes0"; then
AC_MSG_ERROR([ACLs enabled but support not detected])
elif test "x$enable_acl$use_acl" = "xauto0"; then
@@ -132,6 +148,7 @@ int type = ACL_TYPE_EXTENDED;]])],
fi
fi
AC_SUBST([LIB_ACL])
+ AC_SUBST([LIB_HAS_ACL])
AC_DEFINE_UNQUOTED([USE_ACL], [$use_acl],
[Define to nonzero if you want access control list support.])
USE_ACL=$use_acl
diff --git a/modules/acl b/modules/acl
index fdb0d72..7faec17 100644
--- a/modules/acl
+++ b/modules/acl
@@ -11,6 +11,7 @@ error
gettext-h
qacl
quote
+stdbool
configure.ac:
@@ -22,6 +23,7 @@ Include:
Link:
$(LIB_ACL)
+$(LIB_HAS_ACL)
License:
GPL