diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-08-30 13:19:15 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-08-30 13:19:15 +0900 |
| commit | 0122593312679f193e8c2574abf9ae879173d185 (patch) | |
| tree | 4d698d133e17f3db5d6f1fd9cc32f9d83172a2a0 /system/acl/libacl-helper.c | |
| parent | 6aa431d57a2c224c7974bf12d93b46475efecf6e (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.c | 29 |
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; |
