diff options
Diffstat (limited to '')
| -rw-r--r-- | src/slibc-human/machinemode.c | 29 | 
1 files changed, 15 insertions, 14 deletions
diff --git a/src/slibc-human/machinemode.c b/src/slibc-human/machinemode.c index 7efa2b5..dce7630 100644 --- a/src/slibc-human/machinemode.c +++ b/src/slibc-human/machinemode.c @@ -40,22 +40,23 @@   */  int machinemode(mode_t* restrict mode, mode_t* restrict mask, const char* restrict str)  { -#define  S_ISUSR        (S_ISUID | S_IXUSR) -#define  S_ISGRP        (S_ISGID | S_IXGRO) -#define  S_ISOTH        (S_ISVTX | S_IXOTH) +#define  S_ISUSR  (S_ISUID | S_IXUSR) +#define  S_ISGRP  (S_ISGID | S_IXGRO) +#define  S_ISOTH  (S_ISVTX | S_IXOTH) -#define  TEST_(S, T, V)   (strstarts(str, S) && !(T & (v = V))) -#define  TEST(S, T)       (TEST_(S"+", T, 1) || TEST_(S"-", T, 2) || TEST_(S"=", T, 3)) -#define  TESTV(T)         (TEST(#T, T) ? (T = v) : 0) +#define  TEST_(S, T, V)  (strstarts(str, S) && !(T & (v = V))) +#define  TEST(S, T)      (TEST_(S"+", T, 1) || TEST_(S"-", T, 2) || TEST_(S"=", T, 3)) +#define  TESTV(T)        (TEST(#T, T) ? (T = v) : 0) -#define  BITS(var)  \ -  if      (*str == 'r')  { if (var & bits[i][0])  goto invalid;  else  var |= bits[i][0]; }  \ -  else if (*str == 'w')  { if (var & bits[i][1])  goto invalid;  else  var |= bits[i][1]; }  \ -  else if (*str == 'x')  { if (var & bits[i][3])  goto invalid;  else  var |= bits[i][2]; }  \ -  else if (*str == 's')  { if (var & bits[i][3])  goto invalid;  else  var |= bits[i][3]; }  \ -  else if (*str == 'S')  { if (var & bits[i][3])  goto invalid;  else  var |= bits[i][4]; }  \ -  else if (*str == 't')  { if (var & bits[i][3])  goto invalid;  else  var |= bits[i][3]; }  \ -  else if (*str == 'T')  { if (var & bits[i][3])  goto invalid;  else  var |= bits[i][4]; }  \ +#define  BITS_(V, T, S)  if (V & bits[i][T])  goto invalid;  else  var |= bits[i][S] +#define  BITS(V)  \ +  if      (*str == 'r')  { BITS_(V, 0, 0); }  \ +  else if (*str == 'w')  { BITS_(V, 1, 1); }  \ +  else if (*str == 'x')  { BITS_(V, 3, 2); }  \ +  else if (*str == 's')  { BITS_(V, 3, 3); }  \ +  else if (*str == 't')  { BITS_(V, 3, 3); }  \ +  else if (*str == 'S')  { BITS_(V, 3, 4); }  \ +  else if (*str == 'T')  { BITS_(V, 3, 4); }  \    else if (*str != '-')  goto invalid    int i, j, n, u = 0, g = 0, o = 0, v;  | 
