X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/3b7defab20dcc7c6dabb33d3395234a99ef157f3..ad7fbf45c5bba1502237bd4665b0296ce0150734:/fattr.c diff --git a/fattr.c b/fattr.c index 0406a11..adf052d 100644 --- a/fattr.c +++ b/fattr.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: fattr.c,v 1.1 1999/07/26 23:33:56 mdw Exp $ + * $Id: fattr.c,v 1.3 2002/01/13 14:50:22 mdw Exp $ * * Handling of file attributes * @@ -29,6 +29,13 @@ /*----- Revision history --------------------------------------------------* * * $Log: fattr.c,v $ + * Revision 1.3 2002/01/13 14:50:22 mdw + * Delimiter-setting function names change. + * + * Revision 1.2 1999/08/19 18:32:48 mdw + * Improve lexical analysis. In particular, `chmod' patterns don't have to + * be quoted any more. + * * Revision 1.1 1999/07/26 23:33:56 mdw * Support code for new design. * @@ -100,12 +107,14 @@ int fattr_option(scanner *sc, fattr *f) /* --- Gobble an optional `=' sign --- */ + conf_undelim(sc, 0, ",=+-"); token(sc); if (sc->t == '=') token(sc); if (sc->t != CTOK_WORD) error(sc, "parse error, expected file mode"); + conf_undelim(sc, 0, 0); /* --- If it looks digitlike, read as octal --- */ @@ -116,7 +125,8 @@ int fattr_option(scanner *sc, fattr *f) else { const char *p; - unsigned mask = 07777; + unsigned mask = 04700; + unsigned state = 0; unsigned or = 1; /* --- Set the default from the umask --- */ @@ -137,21 +147,21 @@ int fattr_option(scanner *sc, fattr *f) switch (*p) { case ',': break; - case 'a': mask = 07777; break; - case 'u': mask = 04700; break; - case 'g': mask = 02070; break; - case 'o': mask = 01007; break; + case 'a': mask = (mask & state) | 07777; state = 07777; break; + case 'u': mask = (mask & state) | 04700; state = 07777; break; + case 'g': mask = (mask & state) | 02070; state = 07777; break; + case 'o': mask = (mask & state) | 01007; state = 07777; break; - case '=': mode &= ~mask; break; - case '-': or = 0; break; - case '+': or = 1; break; + case '=': mode &= ~mask; /* Drop through */ + case '+': state = 0; or = 1; break; + case '-': state = 0; or = 0; break; #define APPLY(m) if (or) mode |= ((m) & mask); else mode &= ~((m) & mask); - case 'r': APPLY(00444); break; - case 'w': APPLY(00222); break; - case 'x': APPLY(00111); break; - case 's': APPLY(06000); break; - case 't': APPLY(01000); break; + case 'r': state = 0; APPLY(00444); break; + case 'w': state = 0; APPLY(00222); break; + case 'x': state = 0; APPLY(00111); break; + case 's': state = 0; APPLY(06000); break; + case 't': state = 0; APPLY(01000); break; #undef APPLY default: error(sc, "unknown mode character `%c'", *p);