sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit d8718d4159ccb85400baa518d7fdcc1f33558dc2
parent 6492c59072c2b666c5d98a353920c3311807a8f5
Author: sin <sin@2f30.org>
Date:   Thu, 10 Oct 2013 14:50:52 +0100

Do not interpret -[rwxs] as options in chmod(1)

To chmod recursively use `-R' as opposed to `-r' so we can
distinguish it from the mode `-r'.

Diffstat:
Mchmod.c | 38++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/chmod.c b/chmod.c @@ -16,26 +16,44 @@ static mode_t mode = 0; static void usage(void) { - eprintf("usage: %s [-r] mode [file...]\n", argv0); + eprintf("usage: %s [-R] mode [file...]\n", argv0); } int main(int argc, char *argv[]) { + int c; + argv0 = argv[0]; - ARGBEGIN { - case 'r': - rflag = true; - break; - default: - usage(); - } ARGEND; + while (--argc > 0 && (*++argv)[0] == '-') { + while ((c = *++argv[0])) { + switch (c) { + case 'R': + rflag = true; + break; + case 'r': case 'w': case 'x': case 's': + /* + * -[rwxs] are valid modes so do not interpret + * them as options - in any case we are done if + * we hit this case + */ + --argv[0]; + goto done; + default: + usage(); + } + } + } + +done: + parsemode(argv[0]); + argv++; + argc--; if(argc < 1) usage(); - parsemode(argv[0]); - for(++argv; argc > 0; argc--) + for (; argc > 0; argc--, argv++) chmodr(argv[0]); return EXIT_SUCCESS; }