Annotation of researchv10no/cmd/chuck/upchuck.c, revision 1.1

1.1     ! root        1: /* read fstab and drive chuck */
        !             2: /* this has to make up raw device names, or used the cooked devices */
        !             3: #include <fstab.h>
        !             4: #include <sys/param.h> /* param for BITFS */
        !             5: #include <sys/stat.h>
        !             6: #include <libc.h>
        !             7: 
        !             8: enum {E64 = 64};
        !             9: struct fstab fs[E64];  /* surely enough for all time */
        !            10: int procs[E64], pstat[E64];
        !            11: int min = 0x7fffffff, max = -1, exitcode, cnt;
        !            12: char *options = "cwp:";
        !            13: char *cmd = "/etc/chuck";
        !            14: int wflag, cflag;
        !            15: extern int errno;
        !            16: extern char *sys_errlist[];
        !            17: struct stat rst;
        !            18: 
        !            19: main(argc, argv)
        !            20: char **argv;
        !            21: {      int i, n;
        !            22:        int did;
        !            23:        extern int optind;
        !            24:        extern char *optarg;
        !            25:        struct fstab *p;
        !            26:        while((i = getopt(argc, argv, options)) != -1)
        !            27:        switch(i) {
        !            28:        default:
        !            29:                pmesg("weird opt %c, should be %s\n", i, options);
        !            30:                exit(1);
        !            31:        case 'w':
        !            32:                wflag = 1;
        !            33:                continue;
        !            34:        case 'p':
        !            35:                cmd = optarg;
        !            36:                continue;
        !            37:        case 'c':
        !            38:                cflag = 1;
        !            39:                continue;
        !            40:        }
        !            41:        stat("/", &rst);
        !            42:        for(n = 0; n < E64; n++)
        !            43:                if(p = getfsent())
        !            44:                        fs[n] = *p;
        !            45:                else
        !            46:                        break;
        !            47:        if(n >= E64)
        !            48:                pmesg("only doing %d entries from fstab\n", n);
        !            49:        cnt = n;
        !            50:        for(i = 0; i < n; i++) {
        !            51:                if(fs[i].fs_ftype != 0)
        !            52:                        continue;
        !            53:                if(fs[i].fs_passno < min)
        !            54:                        min = fs[i].fs_passno;
        !            55:                if(fs[i].fs_passno > max)
        !            56:                        max = fs[i].fs_passno;
        !            57:        }
        !            58:        for(i = min; i <= max; i++)
        !            59:                pass(i);
        !            60:        for (did = 0, i = 0; i < n; i++) {
        !            61:                if (pstat[i] == 0)
        !            62:                        continue;
        !            63:                if (did == 0) {
        !            64:                        did++;
        !            65:                        pmesg("Failed for:\n");
        !            66:                }
        !            67:                pmesg("%s\n", fs[i].fs_spec);
        !            68:        }
        !            69:        exit(exitcode);
        !            70: }
        !            71: 
        !            72: pass(n)
        !            73: {      int i, pid, stat;
        !            74:        for(i = 0; i < cnt; i++)
        !            75:                if(fs[i].fs_ftype == 0 && fs[i].fs_passno == n)
        !            76:                        execit(i, fs+i);
        !            77:        while((pid = wait(&stat)) != -1) {
        !            78:                for(i = 0; i < cnt; i++)
        !            79:                        if (procs[i] == pid)
        !            80:                                break;
        !            81:                if (i >= cnt) {
        !            82:                        pmesg("upchuck: unexpected wait pid %d stat %d\n", pid, stat);
        !            83:                        continue;
        !            84:                }
        !            85:                pstat[i] = stat;
        !            86:                if (stat == 0)
        !            87:                        continue;
        !            88:                exitcode = 1;
        !            89:                if (stat & 0377)
        !            90:                        pmesg("%s: exit signal %d\n", stat);
        !            91:                pmesg("%s: do manually\n", fs[i].fs_spec);
        !            92:        }
        !            93: }
        !            94: 
        !            95: char *
        !            96: guessraw(s)
        !            97: char *s;
        !            98: {      char *p, *q, *strrchr();
        !            99:        if(cflag)
        !           100:                return(s);
        !           101:        p = strrchr(s, '/');
        !           102:        if(!p)
        !           103:                return(s);
        !           104:        q = (char *)malloc(strlen(s)+2);
        !           105:        *p = 0;
        !           106:        sprintf(q, "%s/r%s", s, p+1);
        !           107:        *p = '/';
        !           108:        if(access(q, 4) == 0)
        !           109:                return(q);
        !           110:        return(s);
        !           111: }
        !           112: 
        !           113: /* cooked device for root, otherwise raw if appropriate access */
        !           114: execit(n, p)
        !           115: struct fstab *p;
        !           116: {      int i, fl = 0;
        !           117:        struct stat stb;
        !           118:        char *s;
        !           119:        if(stat(p->fs_spec, &stb) < 0) {
        !           120:                exitcode = 1;
        !           121:                pmesg("couldn't stat (%s,%s)\n", p->fs_spec, sys_errlist[errno]);
        !           122:                return;
        !           123:        }
        !           124:        /* is it a wretched 4k or a wretched 1k file system? */
        !           125:        if(!BITFS(stb.st_rdev))
        !           126:                fl = 2;
        !           127:        if(stb.st_rdev == rst.st_dev) {
        !           128:                s = p->fs_spec;
        !           129:                goto known;
        !           130:        }
        !           131:        s = guessraw(p->fs_spec);
        !           132: known:
        !           133:        switch(i = fork()) {
        !           134:        case -1:
        !           135:                exitcode = 1;
        !           136:                pmesg("upchuck couldn't fork (%s)\n", sys_errlist[errno]);
        !           137:                return;
        !           138:        case 0:
        !           139:                switch(fl+wflag) {
        !           140:                case 0:
        !           141:                        execlp(cmd, cmd, s, 0);
        !           142:                        break;
        !           143:                case 1:
        !           144:                        execlp(cmd, cmd, "-w", s, 0);
        !           145:                        break;
        !           146:                case 2:
        !           147:                        execlp(cmd, cmd, "-b", "1024", s, 0);
        !           148:                        break;
        !           149:                case 3:
        !           150:                        execlp(cmd, cmd, "-w", "-b", "1024", s, 0);
        !           151:                        break;
        !           152:                }
        !           153:                pmesg("upchuck couldn't exec %s (%s)\n", cmd, sys_errlist[errno]);
        !           154:                exit(1);
        !           155:        default:
        !           156:                procs[n] = i;
        !           157:                return;
        !           158:        }
        !           159: }
        !           160: 
        !           161: char ebuf[128];
        !           162: pmesg(s, a, b, c, d, e, f)
        !           163: char *s;
        !           164: {
        !           165:        sprintf(ebuf, s, a, b, c, d, e, f);
        !           166:        write(2, ebuf, strlen(ebuf));
        !           167: }

unix.superglobalmegacorp.com

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