Annotation of researchv10no/cmd/worm/oscsi/jukebox.c, revision 1.1.1.1

1.1       root        1: #include       <stdio.h>
                      2: #include       <limits.h>
                      3: #include       "scsi.h"
                      4: #include       "juke.h"
                      5: 
                      6: main(int argc, char *argv[])
                      7: {
                      8:        int c;
                      9:        int aflag = 0, eflag = 0, mflag = 0, pflag = 0;
                     10:        int rflag = 0, sflag = 0, uflag = 0, Uflag = 0;
                     11:        long secs = 3600L*24*183;       /* half a year is enough */
                     12:        char *vol_id;
                     13:        char errbuf[1024];
                     14:        extern int optind;
                     15:        extern char *optarg;
                     16: 
                     17:        setbuf(stdout, (char *)0);      /* turn off buffering */
                     18:        while((c = getopt(argc, argv, "aemprsuUw:")) != -1)
                     19:                switch (c)
                     20:                {
                     21:                case 'a':       aflag = 1; break;
                     22:                case 'e':       eflag = 1; break;
                     23:                case 'm':       mflag = 1; break;
                     24:                case 'p':       pflag = 1; break;
                     25:                case 'r':       rflag = 1; break;
                     26:                case 's':       sflag = 1; break;
                     27:                case 'u':       uflag = 1; break;
                     28:                case 'U':       Uflag = 1; break;
                     29:                case 'w':       secs = atol(optarg); break;
                     30:                default:        usage(); break;
                     31:                }
                     32:        s_id = 2;
                     33:        setnlun();
                     34:        if(!aflag&&!eflag&&!mflag&&!pflag&&!rflag&&!uflag&&!Uflag)
                     35:                sflag = 1;
                     36:        vol_id = (optind < argc)? argv[optind] : 0;
                     37:        if(uflag || Uflag)
                     38:                unload(Uflag);
                     39:        if(eflag){
                     40:                if(vol_id == 0){
                     41:                        strcpy(errbuf, "-e needs a vol_id");
                     42:                        goto scram;
                     43:                }
                     44:                if(eject(vol_id, errbuf))
                     45:                        goto scram;
                     46:        }
                     47:        if(rflag){
                     48:                unload(1);
                     49:                sleep(1);
                     50:                if(cold_inv(vol_id? *vol_id : 'u', errbuf) < 0)
                     51:                        goto scram;
                     52:        }
                     53:        if(aflag){
                     54:                if(vol_id == 0){
                     55:                        strcpy(errbuf, "-a needs a vol_id");
                     56:                        goto scram;
                     57:                }
                     58:                if(allocate(vol_id, errbuf))
                     59:                        goto scram;
                     60:        }
                     61:        if(mflag){
                     62:                if((c = j_load(vol_id, errbuf, secs)) < 0)
                     63:                        goto scram;
                     64:                if(s_start(c, errbuf) < 0)
                     65:                        fprintf(stderr, "jukebox: %s\n", errbuf);
                     66:                if(s_stop(c, errbuf) < 0)
                     67:                        fprintf(stderr, "jukebox: %s\n", errbuf);
                     68:                printf("%d\n", c);
                     69:        }
                     70:        if(sflag)
                     71:                prstatus();
                     72:        if(pflag){
                     73:                if(j_rdshelves(errbuf) < 0)
                     74:                        goto scram;
                     75:                for(c = 0; c < NSHELF; c++)
                     76:                        if(j_shelf[c])
                     77:                                printf("%d: %s\n", c, j_shelf[c]);
                     78:        }
                     79:        if(j_wrshelf)
                     80:                if(j_wrshelves(errbuf))
                     81:                        errexit(errbuf);
                     82:        exit(0);
                     83: scram:
                     84:        if(j_wrshelf)
                     85:                j_wrshelves(errbuf);
                     86:        errexit(errbuf);
                     87: }
                     88: 
                     89: usage()
                     90: {
                     91:        fprintf(stderr, "Usage: jukebox [-aemprsuU] [-w secs] [vol_id\n");
                     92:        exit(1);
                     93: }
                     94: 
                     95: errexit(char *errbuf)
                     96: {
                     97:        fprintf(stderr, "jukebox: %s\n", errbuf);
                     98:        exit(1);
                     99: }
                    100: 
                    101: prstatus()
                    102: {
                    103:        struct Lunstatus *l;
                    104:        int c;
                    105:        char errbuf[1024];
                    106:        static char *spin[2] = { "offline", "online" };
                    107: 
                    108:        if(j_getstatus(errbuf)){
                    109:                fprintf(stderr, "jukebox: %s\n", errbuf);
                    110:                exit(1);
                    111:        }
                    112:        if(j_rdshelves(errbuf)){
                    113:                fprintf(stderr, "jukebox: %s\n", errbuf);
                    114:                exit(1);
                    115:        }
                    116:        for(c = 0; c < 8; c++){
                    117:                l = &j_status.lun[c];
                    118:                if(!l->diskin)
                    119:                        continue;
                    120:                printf("lun %d(", c);
                    121:                if(j_status.udrive == (0x80|c))
                    122:                        printf("upper,%s", spin[l->ready]);
                    123:                else if(j_status.ldrive == (0x80|c))
                    124:                        printf("lower,%s", spin[l->ready]);
                    125:                else
                    126:                        printf("in shelf");
                    127:                printf("): ");
                    128:                if(l->shelfvalid){
                    129:                        if(j_shelf[l->retshelf>>1])
                    130:                                printf("%s%c", j_shelf[l->retshelf>>1], "ab"[l->retshelf&1]);
                    131:                        else
                    132:                                printf("unallocated shelf number %d??", l->retshelf);
                    133:                } else
                    134:                        printf("<unknown shelf??>");
                    135:                printf("\n");
                    136:        }
                    137: }
                    138: 
                    139: unload(int force)
                    140: {
                    141:        struct Lunstatus *l;
                    142:        int c;
                    143:        char errbuf[1024];
                    144: 
                    145:        if(j_getstatus(errbuf)){
                    146:                fprintf(stderr, "jukebox: %s\n", errbuf);
                    147:                exit(1);
                    148:        }
                    149:        if(j_rdshelves(errbuf)){
                    150:                fprintf(stderr, "jukebox: %s\n", errbuf);
                    151:                exit(1);
                    152:        }
                    153:        for(c = 0; c < 8; c++){
                    154:                l = &j_status.lun[c];
                    155:                if(!l->diskin)
                    156:                        continue;
                    157:                if(force || !l->ready)
                    158:                        if(j_drive_to_shelf(c, -1, SIDEA, errbuf))
                    159:                                fprintf(stderr, "jukebox: %s\n", errbuf);
                    160:        }
                    161: }
                    162: 
                    163: eject(char *vol_id, char *errbuf)
                    164: {
                    165:        int sh;
                    166:        int dr;
                    167: 
                    168:        if(j_rdshelves(errbuf)){
                    169:                fprintf(stderr, "jukebox: %s\n", errbuf);
                    170:                exit(1);
                    171:        }
                    172:        sh = j_shelfof(vol_id);
                    173:        if(sh < 0){
                    174:                sprintf(errbuf, "xcan't find vol_id %s", vol_id);
                    175:                return(-1);
                    176:        }
                    177:        j_wrshelf = 1;
                    178:        if((dr = j_driveof(vol_id)) >= 0){
                    179:                j_shelf[sh] = 0;
                    180:                return(s_eject(dr, errbuf));
                    181:        }
                    182:        dr = NLUN-1;
                    183:        if(j_shelf_to_drive(sh, SIDEA, dr, errbuf) < 0)
                    184:                return(-1);
                    185:        if(s_eject(dr, errbuf))
                    186:                return(-1);
                    187:        j_shelf[sh] = 0;
                    188:        return(0);
                    189: }

unix.superglobalmegacorp.com

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