From ae4f4e73edbf7955e1c9153e4c0b1e697e10e05f Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 2 Nov 2023 12:08:06 +0300 Subject: [PATCH] fix --- libmu/parse_mode.h | 54 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/libmu/parse_mode.h b/libmu/parse_mode.h index 77b3a2f..c1a5628 100644 --- a/libmu/parse_mode.h +++ b/libmu/parse_mode.h @@ -20,7 +20,59 @@ mode_t mu_parse_mode(const char *s) { if (!*p && mode < 07777U) return mode; - return -1; + mode = 0; + + /* 0 - + */ + int type = 0; + mode_t mask = 0; + + for (size_t i = 0; i < strlen(s); i++) { + switch (s[i]) { + case 'r': + mode |= A(RD_PERM); + break; + + case 'w': + mode |= A(WR_PERM); + break; + + case 'x': + mode |= A(EX_PERM); + break; + + case '+': + type = 0; + break; + + case '-': + type = 1; + break; + + case 'g': + mask |= G(FULL_PERM); + break; + + case 'u': + mask |= U(FULL_PERM); + break; + + case 'o': + mask |= O(FULL_PERM); + break; + + case 'a': + mask |= A(FULL_PERM); + break; + + default: + return -1; + } + } + + if (type) + return ~mask & mode; + + return mask & mode; } #endif