From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS22989 209.51.188.0/24 X-Spam-Status: No, score=-3.9 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 9FC101F698 for ; Fri, 30 Dec 2022 09:39:13 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pBBqn-0000eo-IT; Fri, 30 Dec 2022 04:38:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pBBqg-0000eY-Ps for bug-gnulib@gnu.org; Fri, 30 Dec 2022 04:38:46 -0500 Received: from haproxy.adestotech.com ([217.163.77.122]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pBBqe-000194-Bq for bug-gnulib@gnu.org; Fri, 30 Dec 2022 04:38:46 -0500 Received: from skynet19.adestotech.com (unknown [192.168.129.19]) by haproxy.adestotech.com (Postfix) with ESMTP id 8F0E4A09C7; Fri, 30 Dec 2022 09:38:38 +0000 (GMT) From: Ondrej Valousek To: bug-gnulib@gnu.org, kdudka@redhat.com Cc: Ondrej Valousek Subject: [PATCH] ACL handling simplification + support for NFSv4 Date: Fri, 30 Dec 2022 10:18:37 +0100 Message-Id: <20221230091836.551445-1-ondrej.valousek.xm@renesas.com> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=217.163.77.122; envelope-from=ondrej.valousek.xm@renesas.com; helo=haproxy.adestotech.com X-Spam_score_int: 11 X-Spam_score: 1.1 X-Spam_bar: + X-Spam_report: (1.1 / 5.0 requ) AC_FROM_MANY_DOTS=2.996, BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: bug-gnulib@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gnulib discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnulib-bounces+normalperson=yhbt.net@gnu.org Sender: bug-gnulib-bounces+normalperson=yhbt.net@gnu.org The following patch is aiming to improve & simplify ACL handling in copy-acl.c Changes/Benefits: * we no longer try to decode ACLs, instead we just copy the whole xattr with ACLs making the code simpler and faster * side effect is support for NFSv4 acls Disadvantages: * I agree the patch is maybe too aggresive, but works suprisingly well, but let me know if I missed something important * it pulls in dependency on libattr (so needs to be linked with -lattr, the automake changes are not yet included in this patch), but on the other way, we could possibly ditch dependency on libacl. * we can't do any ACLs conversions, but these are not (AFAIK) being done anyway in the old code As I said, my goal is really for "cp -p" to preserve ACLs regardless of the type. I tried to experiment with variety of filesystems (posix and nfs) and it seems to me to work exactly the way the old code worked (plus handy support for NFSv4). Ondrej --- lib/copy-acl.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/copy-acl.c b/lib/copy-acl.c index 5fc42b7f6..341d1f605 100644 --- a/lib/copy-acl.c +++ b/lib/copy-acl.c @@ -29,6 +29,20 @@ #define _(msgid) gettext (msgid) +#if USE_XATTR + +# include + +static int +copy_attr_permissions (const char *name, struct error_context *ctx) +{ + int action = attr_copy_action (name, ctx); + return action == 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 filename based operations on SRC_NAME. Likewise for DEST_DESC and @@ -43,7 +57,22 @@ int copy_acl (const char *src_name, int source_desc, const char *dst_name, int dest_desc, mode_t mode) { - int ret = qcopy_acl (src_name, source_desc, dst_name, dest_desc, mode); + int ret; +#ifdef USE_XATTR + 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 + */ + if(ret == 0) + ret = source_desc <= 0 && dest_desc <= 0 + ? attr_copy_file (src_name, dst_name, copy_attr_permissions, NULL) + : attr_copy_fd (src_name, source_desc, dst_name, dest_desc, copy_attr_permissions, NULL); +#else + /* no XATTR, so we proceed the old dusty way */ + ret = qcopy_acl (src_name, source_desc, dst_name, dest_desc, mode); +#endif + switch (ret) { case -2: