commit d8718d4159ccb85400baa518d7fdcc1f33558dc2
Author: sin <[email protected]>
Date:   Thu Oct 10 14:50:52 2013 +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'.

diff --git a/chmod.c b/chmod.c
index 9cdb50e..6d0f8a7 100644
--- 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...]
", argv0);
+       eprintf("usage: %s [-R] mode [file...]
", 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;
 }


Reply via email to