aboutsummaryrefslogtreecommitdiffhomepage
path: root/system/acl/libacl-helper.c
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-30 13:19:15 +0900
committerOphestra <cat@gensokyo.uk>2025-08-30 13:19:15 +0900
commit0122593312679f193e8c2574abf9ae879173d185 (patch)
tree4d698d133e17f3db5d6f1fd9cc32f9d83172a2a0 /system/acl/libacl-helper.c
parent6aa431d57a2c224c7974bf12d93b46475efecf6e (diff)
system/acl: wrap libacl errors in PathError
This helps determine which libacl function the errno came from. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'system/acl/libacl-helper.c')
-rw-r--r--system/acl/libacl-helper.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/system/acl/libacl-helper.c b/system/acl/libacl-helper.c
index 905cfa52..d1df8167 100644
--- a/system/acl/libacl-helper.c
+++ b/system/acl/libacl-helper.c
@@ -6,7 +6,7 @@
int hakurei_acl_update_file_by_uid(const char *path_p, uid_t uid,
acl_perm_t *perms, size_t plen) {
- int ret = -1;
+ int ret;
bool v;
int i;
acl_t acl;
@@ -15,51 +15,70 @@ int hakurei_acl_update_file_by_uid(const char *path_p, uid_t uid,
void *qualifier_p;
acl_permset_t permset;
+ ret = -1; /* acl_get_file */
acl = acl_get_file(path_p, ACL_TYPE_ACCESS);
if (acl == NULL)
goto out;
- // prune entries by uid
+ /* prune entries by uid */
for (i = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); i == 1;
i = acl_get_entry(acl, ACL_NEXT_ENTRY, &entry)) {
+ ret = -2; /* acl_get_tag_type */
if (acl_get_tag_type(entry, &tag_type) != 0)
- return -1;
+ goto out;
if (tag_type != ACL_USER)
continue;
+ ret = -3; /* acl_get_qualifier */
qualifier_p = acl_get_qualifier(entry);
if (qualifier_p == NULL)
- return -1;
+ goto out;
v = *(uid_t *)qualifier_p == uid;
acl_free(qualifier_p);
if (!v)
continue;
- acl_delete_entry(acl, entry);
+ ret = -4; /* acl_delete_entry */
+ if (acl_delete_entry(acl, entry) != 0)
+ goto out;
}
if (plen == 0)
goto set;
+ ret = -5; /* acl_create_entry */
if (acl_create_entry(&acl, &entry) != 0)
goto out;
+
+ ret = -6; /* acl_get_permset */
if (acl_get_permset(entry, &permset) != 0)
goto out;
+
+ ret = -7; /* acl_add_perm */
for (i = 0; i < plen; i++) {
if (acl_add_perm(permset, perms[i]) != 0)
goto out;
}
+
+ ret = -8; /* acl_set_tag_type */
if (acl_set_tag_type(entry, ACL_USER) != 0)
goto out;
+
+ ret = -9; /* acl_set_qualifier */
if (acl_set_qualifier(entry, (void *)&uid) != 0)
goto out;
set:
+ ret = -10; /* acl_calc_mask */
if (acl_calc_mask(&acl) != 0)
goto out;
+
+ ret = -11; /* acl_valid */
if (acl_valid(acl) != 0)
goto out;
+
+ ret = -12; /* acl_set_file */
if (acl_set_file(path_p, ACL_TYPE_ACCESS, acl) == 0)
ret = 0;