static int ParseModePosixLinux(char *mode, acl_permset_t perms) { int retv; int more_entries; acl_perm_t perm; enum { add, del } op; op = add; if (*mode == '\0' || *mode == ':') { if (acl_clear_perms(perms) != 0) { Log(LOG_LEVEL_ERR, "Error clearing perms. (acl_clear_perms: %s)", GetErrorStr()); return false; } else { return true; } } more_entries = true; while (more_entries) { switch (*mode) { case '+': op = add; mode++; break; case '-': op = del; mode++; break; case '=': mode++; // fallthrough default: // if mode does not start with + or -, we clear existing perms op = add; if (acl_clear_perms(perms) != 0) { Log(LOG_LEVEL_ERR, "Unable to clear ACL permissions. (acl_clear_perms: %s)", GetErrorStr()); return false; } } // parse generic perms (they are 1-1 on Posix) while (*mode != '\0' && strchr(CF_VALID_GPERMS, *mode)) { if (*mode == '\0') { break; } switch (*mode) { case 'r': perm = ACL_READ; break; case 'w': perm = ACL_WRITE; break; case 'x': perm = ACL_EXECUTE; break; default: Log(LOG_LEVEL_ERR, "No linux support for generic permission flag '%c'", *mode); return false; } if (op == add) { retv = acl_add_perm(perms, perm); } else { retv = acl_delete_perm(perms, perm); } if (retv != 0) { Log(LOG_LEVEL_ERR, "Could not change ACE permission. (acl_[add|delete]_perms: %s)", GetErrorStr()); return false; } mode++; } // parse native perms if (*mode == CF_NATIVE_PERMS_SEP_START) { mode++; while (*mode != '\0' && strchr(CF_VALID_NPERMS_POSIX, *mode)) { switch (*mode) { case 'r': perm = ACL_READ; break; case 'w': perm = ACL_WRITE; break; case 'x': perm = ACL_EXECUTE; break; default: Log(LOG_LEVEL_ERR, "No linux support for native permission flag '%c'", *mode); return false; } if (op == add) { retv = acl_add_perm(perms, perm); } else { retv = acl_delete_perm(perms, perm); } if (retv != 0) { Log(LOG_LEVEL_ERR, "Could not change ACE permission. (acl_[add|delete]_perm: %s)", GetErrorStr()); return false; } mode++; } // scan past native perms end seperator mode++; } if (*mode == ',') { more_entries = true; mode++; } else { more_entries = false; } } return true; }
int __oldacl_delete_perm(acl_permset_t permset_d, oldacl_perm_t perm) { return (acl_delete_perm(permset_d, perm)); }