diff options
Diffstat (limited to 'lib/libc/posix1e/acl_delete_entry.c')
-rw-r--r-- | lib/libc/posix1e/acl_delete_entry.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/lib/libc/posix1e/acl_delete_entry.c b/lib/libc/posix1e/acl_delete_entry.c index e961ab2..760078f 100644 --- a/lib/libc/posix1e/acl_delete_entry.c +++ b/lib/libc/posix1e/acl_delete_entry.c @@ -26,8 +26,6 @@ * $FreeBSD$ */ -/* acl_delete_entry() - delete an ACL entry from an ACL */ - #include <sys/types.h> #include "namespace.h" #include <sys/acl.h> @@ -35,26 +33,41 @@ #include <errno.h> #include <string.h> +/* + * acl_delete_entry() (23.4.9): remove the ACL entry indicated by entry_d + * from acl. + */ int acl_delete_entry(acl_t acl, acl_entry_t entry_d) { + struct acl *acl_int; int i; - if (!acl || !entry_d || (acl->acl_cnt < 1) || - (acl->acl_cnt > ACL_MAX_ENTRIES)) { + if (!acl || !entry_d) { + errno = EINVAL; + return -1; + } + + acl_int = &acl->ats_acl; + + if ((acl->ats_acl.acl_cnt < 1) || + (acl->ats_acl.acl_cnt > ACL_MAX_ENTRIES)) { errno = EINVAL; return -1; } - for (i = 0; i < acl->acl_cnt; i++) { + for (i = 0; i < acl->ats_acl.acl_cnt; i++) { /* if this is our entry... */ - if ((acl->acl_entry[i].ae_tag == entry_d->ae_tag) && - (acl->acl_entry[i].ae_id == entry_d->ae_id)) { + if ((acl->ats_acl.acl_entry[i].ae_tag == entry_d->ae_tag) && + (acl->ats_acl.acl_entry[i].ae_id == entry_d->ae_id)) { /* ...shift the remaining entries... */ - while (i < acl->acl_cnt - 1) - acl->acl_entry[i] = acl->acl_entry[++i]; + while (i < acl->ats_acl.acl_cnt - 1) + acl->ats_acl.acl_entry[i] = + acl->ats_acl.acl_entry[++i]; /* ...drop the count and zero the unused entry... */ - acl->acl_cnt--; - bzero(&acl->acl_entry[i], sizeof(struct acl_entry)); + acl->ats_acl.acl_cnt--; + bzero(&acl->ats_acl.acl_entry[i], + sizeof(struct acl_entry)); + acl->ats_cur_entry = 0; return 0; } } |