-X flag: set execute bits if set anywhere in mode
authorKevin Layer <layer@ucbvax.Berkeley.EDU>
Sun, 1 Apr 1984 12:43:20 +0000 (04:43 -0800)
committerKevin Layer <layer@ucbvax.Berkeley.EDU>
Sun, 1 Apr 1984 12:43:20 +0000 (04:43 -0800)
SCCS-vsn: bin/chmod/chmod.c 4.3

usr/src/bin/chmod/chmod.c

index d945b41..f860835 100644 (file)
@@ -1,4 +1,4 @@
-static char *sccsid = "@(#)chmod.c     4.2 %G%";
+static char *sccsid = "@(#)chmod.c     4.3 %G%";
 
 /*
  * chmod options mode files
 
 /*
  * chmod options mode files
@@ -25,25 +25,32 @@ static char *sccsid = "@(#)chmod.c  4.2 %G%";
 char   *modestring, *ms;
 int    um;
 int    status;
 char   *modestring, *ms;
 int    um;
 int    status;
-int    rflag = 0, debug = 0;
+int    rflag, debug, Xflag;
 
 main(argc,argv)
 char **argv;
 {
        register i;
 
 main(argc,argv)
 char **argv;
 {
        register i;
-       register char *p;
+       register char *p, *flags;
        struct  stat st;
 
        if (argc < 3) {
                fprintf(stderr
        struct  stat st;
 
        if (argc < 3) {
                fprintf(stderr
-                       ,"Usage: chmod [-R] [ugoa][+-=][rwxstugo] file ...\n");
+                       ,"Usage: chmod [-RX] [ugoa][+-=][rwxstugo] file ...\n");
                exit(-1);
        }
                exit(-1);
        }
+
        argv++, --argc;
        argv++, --argc;
-       if (strcmp(argv[0], "-R") == 0) {
-               rflag++;
-               argv++, --argc;
+       if (*argv[0] == '-') {
+               for (flags = argv[0]; *flags; ++flags)
+                       switch (*flags) {
+                         case '-':                     break;
+                         case 'R':     rflag++;        break;
+                         case 'X':     Xflag++;        break;
+                       }
+               argv++, argc--;
        }
        }
+
        modestring = argv[0];
 
        um = umask(0);
        modestring = argv[0];
 
        um = umask(0);
@@ -144,6 +151,8 @@ unsigned nm;
                exit(255);
        }
 ret:
                exit(255);
        }
 ret:
+       if (Xflag && ((savem & S_IFDIR) || (savem & S_IEXEC)))
+               nm = nm | ((nm & 0444) >> 2);
        return(nm);
 }
 
        return(nm);
 }