/* reset an ACL */ static int windows_acl_reset(struct windows_acl_info *w, const char *path) { char *buf; struct stat st; acl_t acl, acl_new, tmp; if ((acl = acl_get_file(path, ACL_TYPE_NFS4)) == NULL) err(EX_OSERR, "%s: acl_get_filed() failed", path); /* remove extended entries */ if ((tmp = acl_strip_np(acl, 0)) == NULL) err(EX_OSERR, "%s: acl_strip_np() failed", path); acl_free(acl); acl = tmp; bzero(&st, sizeof(st)); if (stat(path, &st) < 0) err(EX_OSERR, "%s: acl_from_text() failed", path); acl_new = (S_ISDIR(st.st_mode) == 0) ? w->facl : w->dacl; /* merge the new acl with the existing acl */ if (merge_acl(acl_new, &acl, path) < 0) warn("%s: merge_acl() failed", path); acl_free(acl); /* write out the acl to the file */ if (acl_set_file(path, ACL_TYPE_NFS4, acl_new) < 0) warn("%s: acl_set_file() failed", path); return (0); }
/* * remove extended entries */ void remove_ext(acl_t *prev_acl, const char *filename) { acl_t acl_new; acl_new = acl_strip_np(*prev_acl, !n_flag); if (acl_new == NULL) err(1, "%s: acl_strip_np() failed", filename); acl_free(*prev_acl); *prev_acl = acl_new; }