micro-utils/libmu/parse_mode.h

79 lines
1.0 KiB
C
Raw Normal View History

2023-11-01 11:17:25 +00:00
#ifndef _PARSE_MODE_H
#define _PARSE_MODE_H
#include <sys/stat.h>
2023-11-01 12:33:16 +00:00
#define U(x) (x << 6)
#define G(x) (x << 3)
#define O(x) (x)
#define A(x) (U(x) | G(x) | O(x))
2023-11-01 23:51:11 +00:00
#define WR_PERM (2)
#define EX_PERM (1)
#define RD_PERM (4)
#define FULL_PERM (7)
2023-11-01 12:33:16 +00:00
mode_t mu_parse_mode(const char *s) {
2023-11-01 11:17:25 +00:00
char *p = NULL;
2023-11-01 23:51:11 +00:00
2023-11-01 12:33:16 +00:00
mode_t mode = (mode_t)strtol(s, &p, 8);
2023-11-01 23:51:11 +00:00
if (!*p && mode < 07777U)
2023-11-01 11:17:25 +00:00
return mode;
2023-11-02 09:08:06 +00:00
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;
2023-11-01 11:17:25 +00:00
}
#endif