Annotation of researchv10no/cmd/chmod.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)chmod.c     4.1 (Berkeley) 10/1/80";
                      2: /*
                      3:  * chmod [ugoa][+-=][rwxstugo] files
                      4:  *  change mode of files
                      5:  */
                      6: #include <stdio.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>
                      9: 
                     10: #define        USER    04700   /* user's bits */
                     11: #define        GROUP   02070   /* group's bits */
                     12: #define        OTHER   00007   /* other's bits */
                     13: #define        ALL     01777   /* all (note absence of setuid, etc) */
                     14: 
                     15: #define        READ    00444   /* read permit */
                     16: #define        WRITE   00222   /* write permit */
                     17: #define        EXEC    00111   /* exec permit */
                     18: #define        SETID   06000   /* set[ug]id */
                     19: 
                     20: #define CONC   01000   /* concurrency control */
                     21: 
                     22: char   *ms;
                     23: struct stat st;
                     24: int    cc;             /* type of concurrency control requested */
                     25: 
                     26: main(argc,argv)
                     27: char **argv;
                     28: {
                     29:        register i;
                     30:        register char *p;
                     31:        int status = 0;
                     32: 
                     33:        if (argc < 3) {
                     34:                fprintf(stderr, "Usage: chmod [ugoa][+-=][rwxstugo] file ...\n");
                     35:                exit(255);
                     36:        }
                     37:        ms = argv[1];
                     38:        newmode(0);
                     39:        for (i = 2; i < argc; i++) {
                     40:                p = argv[i];
                     41:                if (stat(p, &st) < 0) {
                     42:                        fprintf(stderr, "chmod: ");
                     43:                        perror(p);
                     44:                        ++status;
                     45:                        continue;
                     46:                }
                     47:                ms = argv[1];
                     48:                if (chmod(p, newmode(st.st_mode)) < 0) {
                     49:                        fprintf(stderr, "chmod: ");
                     50:                        perror(p);
                     51:                        ++status;
                     52:                        continue;
                     53:                }
                     54:        }
                     55:        exit(status);
                     56: }
                     57: 
                     58: newmode(nm)
                     59: unsigned nm;
                     60: {
                     61:        register o, m, b;
                     62: 
                     63:        m = abs();
                     64:        if (!*ms)
                     65:                return(m);
                     66:        do {
                     67:                m = who();
                     68:                while (o = what()) {
                     69:                        b = where(nm);
                     70:                        if (cc || (b&SETID) && (nm&CONC))
                     71:                                nm &= ~S_ICCTYP;
                     72:                        switch (o) {
                     73:                        case '+':
                     74:                                nm |= (b & m) | cc;
                     75:                                break;
                     76:                        case '-':
                     77:                                nm &= ~(b & m);
                     78:                                break;
                     79:                        case '=':
                     80:                                nm &= ~m;
                     81:                                nm |= (b & m) | cc;
                     82:                                break;
                     83:                        }
                     84:                }
                     85:        } while (*ms++ == ',');
                     86:        if (*--ms) {
                     87:                fprintf(stderr, "chmod: invalid mode\n");
                     88:                exit(255);
                     89:        }
                     90:        return(nm);
                     91: }
                     92: 
                     93: abs()
                     94: {
                     95:        register c, i;
                     96: 
                     97:        i = 0;
                     98:        while ((c = *ms++) >= '0' && c <= '7')
                     99:                i = (i << 3) + (c - '0');
                    100:        ms--;
                    101:        return(i);
                    102: }
                    103: 
                    104: who()
                    105: {
                    106:        register m;
                    107: 
                    108:        m = 0;
                    109:        for (;;) switch (*ms++) {
                    110:        case 'u':
                    111:                m |= USER;
                    112:                continue;
                    113:        case 'g':
                    114:                m |= GROUP;
                    115:                continue;
                    116:        case 'o':
                    117:                m |= OTHER;
                    118:                continue;
                    119:        case 'a':
                    120:                m |= ALL;
                    121:                continue;
                    122:        default:
                    123:                ms--;
                    124:                if (m == 0)
                    125:                        m = ALL;
                    126:                return m;
                    127:        }
                    128: }
                    129: 
                    130: what()
                    131: {
                    132:        switch (*ms) {
                    133:        case '+':
                    134:        case '-':
                    135:        case '=':
                    136:                return *ms++;
                    137:        }
                    138:        return(0);
                    139: }
                    140: 
                    141: where(om)
                    142: register om;
                    143: {
                    144:        register m;
                    145: 
                    146:        m = 0;
                    147:        switch (*ms) {
                    148:        case 'u':
                    149:                m = (om & USER) >> 6;
                    150:                goto dup;
                    151:        case 'g':
                    152:                m = (om & GROUP) >> 3;
                    153:                goto dup;
                    154:        case 'o':
                    155:                m = (om & OTHER);
                    156:        dup:
                    157:                m &= (READ|WRITE|EXEC);
                    158:                m |= (m << 3) | (m << 6);
                    159:                ++ms;
                    160:                return m;
                    161:        }
                    162:        for (;;) switch (*ms++) {
                    163:        case 'y':
                    164:                cc = S_ISYNC;
                    165:                continue;
                    166:        case 'e':
                    167:                cc = S_IEXCL;
                    168:                continue;
                    169:        case 'r':
                    170:                m |= READ;
                    171:                continue;
                    172:        case 'w':
                    173:                m |= WRITE;
                    174:                continue;
                    175:        case 'x':
                    176:                m |= EXEC;
                    177:                continue;
                    178:        case 's':
                    179:                m |= SETID;
                    180:                continue;
                    181:        default:
                    182:                ms--;
                    183:                return m;
                    184:        }
                    185: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.