mirror of
https://https.git.savannah.gnu.org/git/gnulib.git
synced 2026-05-13 15:13:36 +00:00
qcopy-acl: Optimize copying of ACLs by directly copying the attributes.
* lib/qcopy-acl.c (is_attr_permissions): New functions. (qcopy_acl): If USE_XATTR, copy the ACL related attributes directly. * m4/xattr.m4: New file. * modules/qcopy-acl (Files): Add it. (configure.ac): Invoke gl_FUNC_XATTR.
This commit is contained in:
committed by
Bruno Haible
parent
2886cca839
commit
eb6a8a4dfb
@@ -1,3 +1,12 @@
|
||||
2023-01-12 Ondrej Valousek <ondrej.valousek.xm@renesas.com>
|
||||
|
||||
qcopy-acl: Optimize copying of ACLs by directly copying the attributes.
|
||||
* lib/qcopy-acl.c (is_attr_permissions): New functions.
|
||||
(qcopy_acl): If USE_XATTR, copy the ACL related attributes directly.
|
||||
* m4/xattr.m4: New file.
|
||||
* modules/qcopy-acl (Files): Add it.
|
||||
(configure.ac): Invoke gl_FUNC_XATTR.
|
||||
|
||||
2023-01-12 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
error: Work around an Android problem.
|
||||
|
||||
@@ -23,6 +23,20 @@
|
||||
|
||||
#include "acl-internal.h"
|
||||
|
||||
#if USE_XATTR
|
||||
|
||||
# include <attr/libattr.h>
|
||||
|
||||
/* Returns 1 if NAME is the name of an extended attribute that is related
|
||||
to permissions, i.e. ACLs. Returns 0 otherwise. */
|
||||
|
||||
static int
|
||||
is_attr_permissions (const char *name, struct error_context *ctx)
|
||||
{
|
||||
return attr_copy_action (name, ctx) == ATTR_ACTION_PERMISSIONS;
|
||||
}
|
||||
|
||||
#endif /* USE_XATTR */
|
||||
|
||||
/* Copy access control lists from one file to another. If SOURCE_DESC is
|
||||
a valid file descriptor, use file descriptor operations, else use
|
||||
@@ -39,13 +53,33 @@ int
|
||||
qcopy_acl (const char *src_name, int source_desc, const char *dst_name,
|
||||
int dest_desc, mode_t mode)
|
||||
{
|
||||
struct permission_context ctx;
|
||||
int ret;
|
||||
|
||||
#ifdef USE_XATTR
|
||||
/* in case no ACLs present and also to set higher mode bits
|
||||
we chmod before setting ACLs as doing it after could overwrite them
|
||||
(especially true for NFSv4, posix ACL has that ugly "mask" hack that
|
||||
nobody understands) */
|
||||
ret = chmod_or_fchmod (dst_name, dest_desc, mode);
|
||||
/* Rather than fiddling with acls one by one, we just copy the whole ACL xattrs
|
||||
(Posix or NFSv4). Of course, that won't address ACLs conversion
|
||||
(i.e. posix <-> nfs4) but we can't do it anyway, so for now, we don't care
|
||||
Functions attr_copy_* return 0 in case we copied something OR nothing
|
||||
to copy */
|
||||
if (ret == 0)
|
||||
ret = source_desc <= 0 || dest_desc <= 0
|
||||
? attr_copy_file (src_name, dst_name, is_attr_permissions, NULL)
|
||||
: attr_copy_fd (src_name, source_desc, dst_name, dest_desc,
|
||||
is_attr_permissions, NULL);
|
||||
#else
|
||||
/* no XATTR, so we proceed the old dusty way */
|
||||
struct permission_context ctx;
|
||||
|
||||
ret = get_permissions (src_name, source_desc, mode, &ctx);
|
||||
if (ret != 0)
|
||||
return -2;
|
||||
ret = set_permissions (&ctx, dst_name, dest_desc);
|
||||
free_permission_context (&ctx);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
42
m4/xattr.m4
Normal file
42
m4/xattr.m4
Normal file
@@ -0,0 +1,42 @@
|
||||
# xattr.m4 - check for Extended Attributes (Linux)
|
||||
# serial 4
|
||||
|
||||
# Copyright (C) 2003-2021 Free Software Foundation, Inc.
|
||||
# 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.
|
||||
|
||||
AC_DEFUN([gl_FUNC_XATTR],
|
||||
[
|
||||
AC_ARG_ENABLE([xattr],
|
||||
AS_HELP_STRING([--disable-xattr],
|
||||
[do not support extended attributes]),
|
||||
[use_xattr=$enableval], [use_xattr=yes])
|
||||
|
||||
LIB_XATTR=
|
||||
AC_SUBST([LIB_XATTR])
|
||||
|
||||
if test "$use_xattr" = "yes"; then
|
||||
AC_CHECK_HEADERS([attr/error_context.h attr/libattr.h])
|
||||
use_xattr=no
|
||||
if test "$ac_cv_header_attr_libattr_h" = yes \
|
||||
&& test "$ac_cv_header_attr_error_context_h" = yes; then
|
||||
xattr_saved_LIBS=$LIBS
|
||||
AC_SEARCH_LIBS([attr_copy_file], [attr],
|
||||
[test "$ac_cv_search_attr_copy_file" = "none required" ||
|
||||
LIB_XATTR="$ac_cv_search_attr_copy_file"])
|
||||
AC_CHECK_FUNCS([attr_copy_file])
|
||||
LIBS=$xattr_saved_LIBS
|
||||
if test "$ac_cv_func_attr_copy_file" = yes; then
|
||||
use_xattr=yes
|
||||
fi
|
||||
fi
|
||||
if test $use_xattr = no; then
|
||||
AC_MSG_WARN([libattr development library was not found or not usable.])
|
||||
AC_MSG_WARN([AC_PACKAGE_NAME will be built without xattr support.])
|
||||
fi
|
||||
fi
|
||||
if test $use_xattr = yes; then
|
||||
AC_DEFINE_UNQUOTED([USE_XATTR], 1)
|
||||
fi
|
||||
])
|
||||
@@ -3,11 +3,13 @@ Copy access control list from one file to another. (Unportable.)
|
||||
|
||||
Files:
|
||||
lib/qcopy-acl.c
|
||||
m4/xattr.m4
|
||||
|
||||
Depends-on:
|
||||
acl-permissions
|
||||
|
||||
configure.ac:
|
||||
gl_FUNC_XATTR
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += qcopy-acl.c
|
||||
|
||||
Reference in New Issue
Block a user