Annotation of researchv10dc/cmd/oworm/scsi/wmount.c, revision 1.1

1.1     ! root        1: #include       "scsi.h"
        !             2: #include       <getflags.h>
        !             3: #include       <string.h>
        !             4: #include       <errno.h>
        !             5: #include       <fio.h>
        !             6: 
        !             7: #define                JDIR            "/usr/worm/jukedir"
        !             8: #define                JMODE           03666
        !             9: #define                NSHELF          50
        !            10: 
        !            11: int NDRIVES;           /* how many to use */
        !            12: 
        !            13: char *shelf[NSHELF];
        !            14: int wr = 0;
        !            15: 
        !            16: main(argc, argv)
        !            17:        char **argv;
        !            18: {
        !            19:        long t;
        !            20: 
        !            21:        (void)time(&t);
        !            22:        srand((int)t);
        !            23:        if((argc = getflags(argc, argv, "clmprsuUe:1[volid]w:1[secs]", 0)) < 0)
        !            24:                usage("[ vol_id ]");
        !            25:        if((argc <= 1) && !flag['u'] && !flag['r'] && !flag['e'] && !flag['l'] && !flag['w'] && !flag['p'])
        !            26:                flag['m'] = flagset;
        !            27:        if(flag['r'] || flag['e'] || flag['l'] || flag['p'] || flag['m'] || flag['u']){
        !            28:                if(scsiinit(1))
        !            29:                        exit(1);
        !            30:        } else {        /* mounting */
        !            31:                if(scsiinit(0)){
        !            32:                        Fprint(1, "0\n");
        !            33:                        exit(0);
        !            34:                }
        !            35:        }
        !            36:        scsiid(2);
        !            37:        NDRIVES = s_ndrives();
        !            38:        if(NDRIVES < 1){
        !            39:                fprint(2, "cannot determine the number of drives\n");
        !            40:                exit(1);
        !            41:        }
        !            42: /*print("using %d drives\n", NDRIVES);/**/
        !            43:        jread();
        !            44:        if(flag['u'])
        !            45:                unload(0);
        !            46:        if(flag['U'])
        !            47:                unload(1);
        !            48:        if(flag['r'])
        !            49:                if(jreload()){
        !            50:                        fprint(2, "reload failed\n");
        !            51:                        exit(1);
        !            52:                }
        !            53:        if(flag['e'])
        !            54:                jeject(flag['e'][0]);
        !            55:        if(flag['l'])
        !            56:                jload();
        !            57:        if(flag['m'])
        !            58:                jmpr();
        !            59:        if(flag['p'])
        !            60:                jpr();
        !            61:        if(wr)
        !            62:                jwrite();
        !            63:        if(argc > 1)
        !            64:                jmount(argv[1]);
        !            65:        else {
        !            66:                if(flag['w']){
        !            67:                        fprint(2, "worm mount: -w given with no vol_id\n");
        !            68:                        exit(1);
        !            69:                }
        !            70:        }
        !            71:        exit(0);
        !            72: }
        !            73: 
        !            74: jpr()
        !            75: {
        !            76:        int i;
        !            77: 
        !            78:        for(i = 0; i < NSHELF; i++)
        !            79:                if(shelf[i]) Fprint(1, "%2d: %s\n", i, shelf[i]);
        !            80:        Fflush(1);
        !            81: }
        !            82: 
        !            83: jmpr()
        !            84: {
        !            85:        int i;
        !            86:        register unsigned char *d;
        !            87:        struct scsi_o o;
        !            88: 
        !            89:        if(s_istatus(0, &o) == 0){
        !            90:                for(i = 0, d = &o.data[18]; i < NDRIVES; i++, d += 4)
        !            91:                        if(*d&0x80)
        !            92:                                Fprint(1, "drive %d: %s%c, %sline\n", i,
        !            93:                                        shelf[(*d&0x7F)/2], (*d&1)? 'b':'a',
        !            94:                                        (d[-2]&1)?"on":"off");
        !            95:        }
        !            96:        Fflush(1);
        !            97: }
        !            98: 
        !            99: jeject(s)
        !           100:        char *s;
        !           101: {
        !           102:        int i, me, drive;
        !           103:        register unsigned char *d;
        !           104:        struct scsi_o o;
        !           105: 
        !           106:        if(s_istatus(0, &o) == 0){
        !           107:                for(i = 0, d = &o.data[18]; i < NDRIVES; i++, d += 4)
        !           108:                        if((*d&0x80) && (strcmp(s, shelf[me = (*d&0x7F)/2]) == 0)){
        !           109:                                if(s_diskeject(i))
        !           110:                                        fprint(2, "worm mount: couldn't eject drive %d\n", i);
        !           111:                                shelf[me] = 0;
        !           112:                                wr = 1;
        !           113:                                return;
        !           114:                        }
        !           115:        }
        !           116:        drive = getdrive();
        !           117:        for(i = 0; i < NSHELF; i++)
        !           118:                if(strcmp(shelf[i], s) == 0){
        !           119:                        if(s_diskset(i, A, drive, 1)){
        !           120:                                fprint(2, "worm mount: couldn't load %s into drive 1\n", s);
        !           121:                                return;
        !           122:                        }
        !           123:                        if(s_diskeject(1)){
        !           124:                                fprint(2, "worm mount: couldn't eject %s from drive 1\n", s);
        !           125:                                s_diskrelease(-1, A, drive, 1);
        !           126:                                return;
        !           127:                        }
        !           128:                        shelf[i] = 0;
        !           129:                        wr = 1;
        !           130:                        return;
        !           131:                }
        !           132:        fprint(2, "worm mount: can't find %s\n", s);
        !           133:        exit(1);
        !           134: }
        !           135: 
        !           136: jload()
        !           137: {
        !           138:        int i;
        !           139:        int drive, flip;
        !           140:        char s[256], *side;
        !           141:        struct scsi_o output;
        !           142:        int ndone = 0;
        !           143: 
        !           144:        drive = getdrive();
        !           145:        Fprint(1, "loading new disks\n");
        !           146: loop:
        !           147:        if(s_diskset(127, A, drive, 0)){
        !           148:                Fprint(1, "%d new disk%s loaded\n", ndone, ndone==1? "":"s");
        !           149:                return;
        !           150:        }
        !           151:        Fprint(1, "loading... "); Fflush(1);
        !           152:        if(s_start(drive)){
        !           153:                fprint(2, "worm mount: drive %d won't start\n", drive);
        !           154:                return;
        !           155:        }
        !           156:        s_readid(drive, s);
        !           157:        side = &s[strlen(s)-1];
        !           158:        if((*s == 0) || ((*side != 'a')&&(*side != 'b'))){
        !           159:                fprint(2, "worm mount: bad name '%s' in drive %d\n", s, drive);
        !           160:                return;
        !           161:        }
        !           162:        flip = (*side =='a')? A:B;
        !           163:        *side = 0;
        !           164:        if(strcmp(s, UNLABELLED))
        !           165:        for(i = 0; i < NSHELF; i++)
        !           166:                if(strcmp(shelf[i], s) == 0){
        !           167:                        fprint(2, "worm mount: %s was listed shelf %d\n", s, i);
        !           168:                        shelf[i] = 0;
        !           169:                        break;
        !           170:                }
        !           171:        for(i = 0; i < NSHELF; i++)
        !           172:                if(shelf[i] == 0){
        !           173:                        if(s_diskrelease(i, flip, drive, 1)){
        !           174:                                fprint(2, "worm mount: %s to shelf %d failed\n", s, i);
        !           175:                                return;
        !           176:                        }
        !           177:                        shelf[i] = strdup(s);
        !           178:                        print("%s loaded to shelf %d\n", s, i);
        !           179:                        wr = 1;
        !           180:                        ndone++;
        !           181:                        goto loop;
        !           182:                }
        !           183:        fprint(2, "worm mount: no space left for %s\n", s);
        !           184: }
        !           185: 
        !           186: jreload()
        !           187: {
        !           188:        int i, dest, flip, try;
        !           189:        int drive = 1;
        !           190:        char s[256], *side;
        !           191:        struct scsi_o output;
        !           192:        int todo[NSHELF];
        !           193: 
        !           194:        flag['l'] = flagset;
        !           195:        for(i = 0; i < NSHELF; i++)
        !           196:                shelf[i] = 0, todo[i] = 0;
        !           197:        drive = getdrive();
        !           198:        if(s_istatus(drive, &output))
        !           199:                return(1);
        !           200:        for(i = 0; i < NSHELF; i++)
        !           201:                if((output.data[48+i]&0x80) && (output.data[48+i]&0x60)){
        !           202:                        shelf[i] = "";
        !           203:                        todo[i] = 1;
        !           204:                }
        !           205:        for(i = 0, try = 0; i < NSHELF; i++, try++){
        !           206:                if(!todo[i]) continue;
        !           207:                if(s_diskset(i, A, drive, 0))
        !           208:                        continue;
        !           209:                Fprint(1, "doing shelf %d: ", i); Fflush(1);
        !           210:                if(s_start(drive)){
        !           211:                        fprint(2, "worm mount: drive %d won't start\n", drive);
        !           212:                        exit(1);
        !           213:                }
        !           214:                s_readid(drive, s);
        !           215:                if(strcmp(s, UNLABELLED) == 0)
        !           216:                        strcat(s, "a");
        !           217:                side = &s[strlen(s)-1];
        !           218:                if((*s == 0) || ((*side != 'a')&&(*side != 'b'))){
        !           219:                        fprint(2, "worm mount: bad volid '%s', %s\n", s, try?"ignoring":"retrying");
        !           220:                        if(try == 0){
        !           221:                                s_diskrelease(i, B, drive, 1);
        !           222:                                i--;
        !           223:                        }
        !           224:                        continue;
        !           225:                }
        !           226:        sleep(1);
        !           227:                if(flag['c']){
        !           228:                        for(dest = 0; dest < i; dest++)
        !           229:                                if(shelf[dest] == 0) break;
        !           230:                } else if(flag['s']){
        !           231:                        while(shelf[dest = nrand(NSHELF)] && (i != dest))
        !           232:                                ;
        !           233:                } else
        !           234:                        dest = i;
        !           235:                flip = (*side == 'a')? A:B;
        !           236:                if(s_diskrelease(dest, flip, drive, 1)){
        !           237:                        fprint(2, "worm mount: %s to shelf %d failed\n", s, dest);                              exit(1);
        !           238:                }
        !           239:                *side = 0;
        !           240:                Fprint(1, "%s", s);
        !           241:                if(dest != i)
        !           242:                        Fprint(1, " -> shelf %d", dest);
        !           243:                Fprint(1, "\n"); Fflush(1);
        !           244: sleep(1);
        !           245:                shelf[i] = 0;
        !           246:                shelf[dest] = strdup(s);
        !           247:                wr = 1;
        !           248:                try = -1;
        !           249:        }
        !           250:        return(0);
        !           251: }
        !           252: 
        !           253: #define        STEP    5
        !           254: 
        !           255: jmount(vol)
        !           256:        char *vol;
        !           257: {
        !           258:        int limit, i, sh, flip;
        !           259:        unsigned char *d;
        !           260:        char *ss;
        !           261:        struct scsi_o o;
        !           262: 
        !           263:        ss = &vol[strlen(vol)-1];
        !           264:        if((*ss != 'a') && (*ss != 'b')){
        !           265:                fprint(2, "worm mount: mount name (%s) must end in [ab]\n", vol);
        !           266:                exit(1);
        !           267:        }
        !           268:        flip = (*ss == 'a')? A:B;
        !           269:        *ss = 0;
        !           270:        for(sh = 0; sh < NSHELF; sh++)
        !           271:                if(shelf[sh] && (strcmp(vol, shelf[sh]) == 0))
        !           272:                        break;
        !           273:        if(sh == NSHELF){
        !           274:                fprint(2, "worm mount: no disk with vol_id '%s'\n", vol);
        !           275:                exit(1);
        !           276:        }
        !           277:        limit = flag['w']? atoi(flag['w'][0]) : 9999999;
        !           278:        for(; limit > -STEP; limit -= STEP, sleep(STEP)){
        !           279:                if(s_istatus(0, &o))
        !           280:                        continue;
        !           281:                for(i = 0, d = &o.data[18]; i < NDRIVES; i++, d += 4)
        !           282:                        if((*d&0x80) && (strcmp(shelf[(*d&0x7F)/2], vol) == 0)){
        !           283:                                if(((*d&1) == flip) && (d[-1] != 0x80)){
        !           284:                                        Fprint(1, "%d\n", i);
        !           285:                                        return;
        !           286:                                }
        !           287:                                s_diskrelease(-1, A, i, 0);
        !           288:                        }
        !           289:                for(i = 0, d = &o.data[18]; i < NDRIVES; i++, d += 4)
        !           290:                        if((d[-2]&0x40) == 0){
        !           291:                                if(s_diskset(sh, flip, i, 1))
        !           292:                                        exit(1);
        !           293: /*----->*/                     prompt(i);
        !           294:                                Fprint(1, "%d\n", i);
        !           295:                                return;
        !           296:                        }
        !           297:                for(i = 0, d = &o.data[18]; i < NDRIVES; i++, d += 4)
        !           298:                        if((d[-2]&1) == 0){
        !           299:                                s_diskrelease(-1, A, i, 0);
        !           300:                        }
        !           301:        }
        !           302: }
        !           303: 
        !           304: jread()
        !           305: {
        !           306:        int fd, errs = 0;
        !           307:        int ntries;
        !           308:        register char *s, *ss;
        !           309: 
        !           310:        for(ntries = 0; ntries < 10; ntries++){
        !           311:                if((fd = open(JDIR, 0)) >= 0)
        !           312:                        break;
        !           313:                if(errno != ECONC)
        !           314:                        break;
        !           315:                sleep(1);
        !           316:        }
        !           317:        if(fd < 0){
        !           318:                perror(JDIR);
        !           319:                exit(1);
        !           320:        }
        !           321:        Finit(fd, (char *)0);
        !           322:        while(s = Frdline(fd)){
        !           323:                if(ss = strchr(s, ' ')){
        !           324:                        *ss++ = 0;
        !           325:                        shelf[atoi(s)] = strdup(ss);
        !           326:                } else {
        !           327:                        Fprint(2, "bad line: '%s'\n", s);
        !           328:                        errs++;
        !           329:                }
        !           330:        }
        !           331:        if(errs){
        !           332:                fprint(2, "%d errors\n", errs);
        !           333:                exit(1);
        !           334:        }
        !           335:        close(fd);
        !           336: }
        !           337: 
        !           338: jwrite()
        !           339: {
        !           340:        int ntries, fd, i;
        !           341: 
        !           342:        for(ntries = 0; ntries < 10; ntries++){
        !           343:                if((fd = creat(JDIR, JMODE)) >= 0)
        !           344:                        break;
        !           345:                if(errno != ECONC)
        !           346:                        break;
        !           347:                sleep(1);
        !           348:        }
        !           349:        if(fd < 0){
        !           350:                perror(JDIR);
        !           351:                exit(1);
        !           352:        }
        !           353:        Finit(fd, (char *)0);
        !           354:        for(i = 0; i < NSHELF; i++)
        !           355:                if(shelf[i])
        !           356:                        Fprint(fd, "%d %s\n", i, shelf[i]);
        !           357:        Fflush(fd);
        !           358:        close(fd);
        !           359: }
        !           360: 
        !           361: unload(force)
        !           362: {
        !           363:        int i, ret = -1;
        !           364:        unsigned char *d;
        !           365:        struct scsi_o output;
        !           366: 
        !           367:        if(s_istatus(0, &output))
        !           368:                return(1);
        !           369:        for(i = 0; i < NDRIVES; i++){
        !           370:                d = &output.data[16+4*i];
        !           371:                if((*d&0x40) || force){
        !           372:                        if(((*d&1) == 0) || force)
        !           373:                                s_diskrelease(-1, A, i, 0);
        !           374:                } else
        !           375:                        ret = i;
        !           376:        }
        !           377:        return(ret);
        !           378: }
        !           379: 
        !           380: getdrive()
        !           381: {
        !           382:        int i;
        !           383: 
        !           384:        if((i = unload(0)) < 0)
        !           385:                i = NDRIVES;
        !           386:        return(i);
        !           387: }
        !           388: 
        !           389: #include       <sys/types.h>
        !           390: #include       <sys/udaioc.h>
        !           391: 
        !           392: prompt(i)
        !           393: {
        !           394:        char buf[1024];
        !           395:        int fd;
        !           396: 
        !           397:        sprint(buf, "/dev/worm%d", i);
        !           398:        fd = open(buf, 0);
        !           399:        read(fd, buf, sizeof buf);
        !           400:        ioctl(fd, UIOSPDW);
        !           401:        close(fd);
        !           402:        sleep(1);
        !           403: }

unix.superglobalmegacorp.com

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