aboutsummaryrefslogtreecommitdiffhomepage
path: root/acl/acl-update.c
diff options
context:
space:
mode:
Diffstat (limited to 'acl/acl-update.c')
-rw-r--r--acl/acl-update.c71
1 files changed, 0 insertions, 71 deletions
diff --git a/acl/acl-update.c b/acl/acl-update.c
deleted file mode 100644
index c6816f61..00000000
--- a/acl/acl-update.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include "acl-update.h"
-#include <acl/libacl.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <sys/acl.h>
-
-int hakurei_acl_update_file_by_uid(const char *path_p, uid_t uid,
- acl_perm_t *perms, size_t plen) {
- int ret = -1;
- bool v;
- int i;
- acl_t acl;
- acl_entry_t entry;
- acl_tag_t tag_type;
- void *qualifier_p;
- acl_permset_t permset;
-
- acl = acl_get_file(path_p, 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)) {
- if (acl_get_tag_type(entry, &tag_type) != 0)
- return -1;
- if (tag_type != ACL_USER)
- continue;
-
- qualifier_p = acl_get_qualifier(entry);
- if (qualifier_p == NULL)
- return -1;
- v = *(uid_t *)qualifier_p == uid;
- acl_free(qualifier_p);
-
- if (!v)
- continue;
-
- acl_delete_entry(acl, entry);
- }
-
- if (plen == 0)
- goto set;
-
- if (acl_create_entry(&acl, &entry) != 0)
- goto out;
- if (acl_get_permset(entry, &permset) != 0)
- goto out;
- for (i = 0; i < plen; i++) {
- if (acl_add_perm(permset, perms[i]) != 0)
- goto out;
- }
- if (acl_set_tag_type(entry, ACL_USER) != 0)
- goto out;
- if (acl_set_qualifier(entry, (void *)&uid) != 0)
- goto out;
-
-set:
- if (acl_calc_mask(&acl) != 0)
- goto out;
- if (acl_valid(acl) != 0)
- goto out;
- if (acl_set_file(path_p, ACL_TYPE_ACCESS, acl) == 0)
- ret = 0;
-
-out:
- free((void *)path_p);
- if (acl != NULL)
- acl_free((void *)acl);
- return ret;
-}