tar-util: use the same table for converting acl tag

Note, ACL_UNDEFINED_TAG == _ARCHIVE_ENTRY_ACL_UNDEFINED, hence this
does not change any behavior.

(cherry picked from commit f19861d9ac)
This commit is contained in:
Yu Watanabe
2026-10-16 11:36:31 +01:00
committed by Luca Boccassi
parent bfba34d783
commit f1a0bfa417
+34 -30
View File
@@ -206,6 +206,38 @@ static int open_inode_finalize_many(OpenInode **array, size_t *n) {
return r;
}
static const struct {
int libarchive;
acl_tag_t libacl;
} acl_tag_map[] = {
{ ARCHIVE_ENTRY_ACL_USER, ACL_USER },
{ ARCHIVE_ENTRY_ACL_GROUP, ACL_GROUP },
{ ARCHIVE_ENTRY_ACL_USER_OBJ, ACL_USER_OBJ },
{ ARCHIVE_ENTRY_ACL_GROUP_OBJ, ACL_GROUP_OBJ },
{ ARCHIVE_ENTRY_ACL_MASK, ACL_MASK },
{ ARCHIVE_ENTRY_ACL_OTHER, ACL_OTHER },
};
static acl_tag_t libarchive_acl_tag_to_libacl_tag(int libarchive_tag) {
FOREACH_ELEMENT(t, acl_tag_map)
if (t->libarchive == libarchive_tag)
return t->libacl;
return ACL_UNDEFINED_TAG;
}
#if HAVE_ACL
#define _ARCHIVE_ENTRY_ACL_UNDEFINED 0
static int libacl_tag_to_libarchive_acl_tag(acl_tag_t libacl_tag) {
FOREACH_ELEMENT(t, acl_tag_map)
if (t->libacl == libacl_tag)
return t->libarchive;
return _ARCHIVE_ENTRY_ACL_UNDEFINED;
}
#endif
static int archive_unpack_regular(
struct archive *a,
struct archive_entry *entry,
@@ -541,24 +573,7 @@ static int archive_entry_read_acl(
assert(rtype == type);
static const struct {
int libarchive;
acl_tag_t libacl;
} tag_map[] = {
{ ARCHIVE_ENTRY_ACL_USER, ACL_USER },
{ ARCHIVE_ENTRY_ACL_GROUP, ACL_GROUP },
{ ARCHIVE_ENTRY_ACL_USER_OBJ, ACL_USER_OBJ },
{ ARCHIVE_ENTRY_ACL_GROUP_OBJ, ACL_GROUP_OBJ },
{ ARCHIVE_ENTRY_ACL_MASK, ACL_MASK },
{ ARCHIVE_ENTRY_ACL_OTHER, ACL_OTHER },
};
acl_tag_t ntag = ACL_UNDEFINED_TAG;
FOREACH_ELEMENT(t, tag_map)
if (t->libarchive == tag) {
ntag = t->libacl;
break;
}
acl_tag_t ntag = libarchive_acl_tag_to_libacl_tag(tag);
if (ntag == ACL_UNDEFINED_TAG)
continue;
@@ -1330,18 +1345,7 @@ static int archive_write_acl(
if (sym_acl_get_tag_type(e, &ntag) < 0)
return log_error_errno(errno, "Failed to get ACL entry tag: %m");
static const int tag_map[] = {
[ACL_USER] = ARCHIVE_ENTRY_ACL_USER,
[ACL_GROUP] = ARCHIVE_ENTRY_ACL_GROUP,
[ACL_USER_OBJ] = ARCHIVE_ENTRY_ACL_USER_OBJ,
[ACL_GROUP_OBJ] = ARCHIVE_ENTRY_ACL_GROUP_OBJ,
[ACL_MASK] = ARCHIVE_ENTRY_ACL_MASK,
[ACL_OTHER] = ARCHIVE_ENTRY_ACL_OTHER,
};
assert_cc(ACL_UNDEFINED_TAG == 0); /* safety check, we assume that holes are filled with ACL_UNDEFINED_TAG */
assert_cc(ELEMENTSOF(tag_map) <= 64); /* safety check, we assume that the tag ids are all packed and low */
int tag = ntag >= 0 && ntag < (acl_tag_t) ELEMENTSOF(tag_map) ? tag_map[ntag] : ACL_UNDEFINED_TAG;
int tag = libacl_tag_to_libarchive_acl_tag(ntag);
bool skip = false;
id_t qualifier = UID_INVALID;