diff options
Diffstat (limited to 'internal/acl')
| -rw-r--r-- | internal/acl/libacl-helper.c | 200 | ||||
| -rw-r--r-- | internal/acl/libacl-helper.h | 35 |
2 files changed, 115 insertions, 120 deletions
diff --git a/internal/acl/libacl-helper.c b/internal/acl/libacl-helper.c index 5fa35c18..c56e6436 100644 --- a/internal/acl/libacl-helper.c +++ b/internal/acl/libacl-helper.c @@ -7,129 +7,127 @@ #include <fcntl.h> #include <sys/acl.h> -enum hakurei_acl_status hakurei_update_acl( - int fd, - uid_t uid, - acl_perm_t perms) { - enum hakurei_acl_status ret; +enum hakurei_acl_status hakurei_update_acl(int fd, uid_t uid, acl_perm_t perms) +{ + enum hakurei_acl_status ret; - bool v; - int i; - acl_t acl, acl_d = NULL; - acl_entry_t entry; - acl_tag_t tag_type; - void *qualifier_p; - acl_permset_t permset; - acl_perm_t has_perms; + bool v; + int i; + acl_t acl, acl_d = NULL; + acl_entry_t entry; + acl_tag_t tag_type; + void *qualifier_p; + acl_permset_t permset; + acl_perm_t has_perms; - ret = HAKUREI_ACL_GET_FILE; - acl = acl_get_file_at(fd, "", AT_EMPTY_PATH, ACL_TYPE_ACCESS); - if (acl == NULL) - goto out; + ret = HAKUREI_ACL_GET_FILE; + acl = acl_get_file_at(fd, "", AT_EMPTY_PATH, ACL_TYPE_ACCESS); + if (acl == NULL) + goto out; - /* 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 = HAKUREI_ACL_GET_TAG_TYPE; - if (acl_get_tag_type(entry, &tag_type) != 0) - goto out; - if (tag_type != ACL_USER) - continue; + /* 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 = HAKUREI_ACL_GET_TAG_TYPE; + if (acl_get_tag_type(entry, &tag_type) != 0) + goto out; + if (tag_type != ACL_USER) + continue; - ret = HAKUREI_ACL_GET_QUALIFIER; - qualifier_p = acl_get_qualifier(entry); - if (qualifier_p == NULL) - goto out; - v = *(uid_t *)qualifier_p == uid; - acl_free(qualifier_p); + ret = HAKUREI_ACL_GET_QUALIFIER; + qualifier_p = acl_get_qualifier(entry); + if (qualifier_p == NULL) + goto out; + v = *(uid_t *)qualifier_p == uid; + acl_free(qualifier_p); - if (!v) - continue; + if (!v) + continue; - ret = HAKUREI_ACL_GET_PERMSET; - if (acl_get_permset(entry, &permset) != 0) - goto out; + ret = HAKUREI_ACL_GET_PERMSET; + if (acl_get_permset(entry, &permset) != 0) + goto out; - if (perms == 0) - goto delete; + if (perms == 0) + goto delete; - /* this is quite ugly, but the standard makes it impossible to directly - * obtain these bits */ - has_perms = 0; -#define COPY_PERM_BIT(perm) \ - do { \ - ret = HAKUREI_ACL_GET_PERM; \ - i = acl_get_perm(permset, perm); \ - if (i < 0) \ - goto out; \ - if (i > 0) \ - has_perms |= perm; \ - } while (0) - COPY_PERM_BIT(ACL_READ); - COPY_PERM_BIT(ACL_WRITE); - COPY_PERM_BIT(ACL_EXECUTE); + /* this is quite ugly, but the standard makes it impossible to + * directly obtain these bits */ + has_perms = 0; +#define COPY_PERM_BIT(perm) \ + do { \ + ret = HAKUREI_ACL_GET_PERM; \ + i = acl_get_perm(permset, perm); \ + if (i < 0) \ + goto out; \ + if (i > 0) \ + has_perms |= perm; \ + } while (0) + COPY_PERM_BIT(ACL_READ); + COPY_PERM_BIT(ACL_WRITE); + COPY_PERM_BIT(ACL_EXECUTE); - if (perms == has_perms) { - ret = HAKUREI_ACL_DUP; - acl_d = acl_dup(acl); - if (acl_d == NULL) - goto out; + if (perms == has_perms) { + ret = HAKUREI_ACL_DUP; + acl_d = acl_dup(acl); + if (acl_d == NULL) + goto out; - ret = HAKUREI_ACL_CALC_MASK; - if (acl_calc_mask(&acl_d) != 0) - goto out; + ret = HAKUREI_ACL_CALC_MASK; + if (acl_calc_mask(&acl_d) != 0) + goto out; - ret = HAKUREI_ACL_OK; - if (acl_cmp(acl, acl_d) == 0) - goto out; - } + ret = HAKUREI_ACL_OK; + if (acl_cmp(acl, acl_d) == 0) + goto out; + } - delete: - ret = HAKUREI_ACL_DELETE_ENTRY; - if (acl_delete_entry(acl, entry) != 0) - goto out; - } +delete: + ret = HAKUREI_ACL_DELETE_ENTRY; + if (acl_delete_entry(acl, entry) != 0) + goto out; + } - if (perms == 0) - goto set; + if (perms == 0) + goto set; - ret = HAKUREI_ACL_CREATE_ENTRY; - if (acl_create_entry(&acl, &entry) != 0) - goto out; + ret = HAKUREI_ACL_CREATE_ENTRY; + if (acl_create_entry(&acl, &entry) != 0) + goto out; - ret = HAKUREI_ACL_GET_PERMSET; - if (acl_get_permset(entry, &permset) != 0) - goto out; + ret = HAKUREI_ACL_GET_PERMSET; + if (acl_get_permset(entry, &permset) != 0) + goto out; - ret = HAKUREI_ACL_ADD_PERM; - if (acl_add_perm(permset, perms) != 0) - goto out; + ret = HAKUREI_ACL_ADD_PERM; + if (acl_add_perm(permset, perms) != 0) + goto out; - ret = HAKUREI_ACL_SET_TAG_TYPE; - if (acl_set_tag_type(entry, ACL_USER) != 0) - goto out; + ret = HAKUREI_ACL_SET_TAG_TYPE; + if (acl_set_tag_type(entry, ACL_USER) != 0) + goto out; - ret = HAKUREI_ACL_SET_QUALIFIER; - if (acl_set_qualifier(entry, (void *)&uid) != 0) - goto out; + ret = HAKUREI_ACL_SET_QUALIFIER; + if (acl_set_qualifier(entry, (void *)&uid) != 0) + goto out; set: - ret = HAKUREI_ACL_CALC_MASK; - if (acl_calc_mask(&acl) != 0) - goto out; + ret = HAKUREI_ACL_CALC_MASK; + if (acl_calc_mask(&acl) != 0) + goto out; - ret = HAKUREI_ACL_VALID; - if (acl_valid(acl) != 0) - goto out; + ret = HAKUREI_ACL_VALID; + if (acl_valid(acl) != 0) + goto out; - ret = HAKUREI_ACL_SET_FILE; - if (acl_set_file_at(fd, "", AT_EMPTY_PATH, ACL_TYPE_ACCESS, acl) == 0) - ret = HAKUREI_ACL_OK; + ret = HAKUREI_ACL_SET_FILE; + if (acl_set_file_at(fd, "", AT_EMPTY_PATH, ACL_TYPE_ACCESS, acl) == 0) + ret = HAKUREI_ACL_OK; out: - if (acl != NULL) - acl_free((void *)acl); - if (acl_d != NULL) - acl_free((void *)acl_d); - return ret; + if (acl != NULL) + acl_free((void *)acl); + if (acl_d != NULL) + acl_free((void *)acl_d); + return ret; } diff --git a/internal/acl/libacl-helper.h b/internal/acl/libacl-helper.h index 10711dd3..111fac4a 100644 --- a/internal/acl/libacl-helper.h +++ b/internal/acl/libacl-helper.h @@ -1,24 +1,21 @@ #include <sys/acl.h> enum hakurei_acl_status { - HAKUREI_ACL_OK, - HAKUREI_ACL_GET_FILE, - HAKUREI_ACL_GET_TAG_TYPE, - HAKUREI_ACL_GET_QUALIFIER, - HAKUREI_ACL_DELETE_ENTRY, - HAKUREI_ACL_CREATE_ENTRY, - HAKUREI_ACL_GET_PERMSET, - HAKUREI_ACL_ADD_PERM, - HAKUREI_ACL_SET_TAG_TYPE, - HAKUREI_ACL_SET_QUALIFIER, - HAKUREI_ACL_CALC_MASK, - HAKUREI_ACL_VALID, - HAKUREI_ACL_SET_FILE, - HAKUREI_ACL_GET_PERM, - HAKUREI_ACL_DUP, + HAKUREI_ACL_OK, + HAKUREI_ACL_GET_FILE, + HAKUREI_ACL_GET_TAG_TYPE, + HAKUREI_ACL_GET_QUALIFIER, + HAKUREI_ACL_DELETE_ENTRY, + HAKUREI_ACL_CREATE_ENTRY, + HAKUREI_ACL_GET_PERMSET, + HAKUREI_ACL_ADD_PERM, + HAKUREI_ACL_SET_TAG_TYPE, + HAKUREI_ACL_SET_QUALIFIER, + HAKUREI_ACL_CALC_MASK, + HAKUREI_ACL_VALID, + HAKUREI_ACL_SET_FILE, + HAKUREI_ACL_GET_PERM, + HAKUREI_ACL_DUP, }; -enum hakurei_acl_status hakurei_update_acl( - int fd, - uid_t uid, - acl_perm_t perms); +enum hakurei_acl_status hakurei_update_acl(int fd, uid_t uid, acl_perm_t perms); |
