|
|
1.1 ! root 1: #define _POSIX_SOURCE ! 2: #include <stddef.h> ! 3: #include <stdio.h> ! 4: #include <stdlib.h> ! 5: #include <unistd.h> ! 6: #include <string.h> ! 7: #include "scsi.h" ! 8: #include "jukeface.h" ! 9: #include "jukebox.h" ! 10: #include "arg.h" ! 11: ! 12: Jukebox jukebox; ! 13: char *argv0; ! 14: static void prstatus(void); ! 15: static void usage(void); ! 16: static void errexit(char *errbuf); ! 17: static void unload(int); ! 18: static eject(Jukebox *j, char *vol_id, char *errbuf); ! 19: ! 20: main(int argc, char *argv[]) ! 21: { ! 22: int c; ! 23: int aflag = 0, eflag = 0, mflag = 0, pflag = 0; ! 24: int rflag = 0, sflag = 0, uflag = 0, Uflag = 0; ! 25: int reset = 0; ! 26: int warm = 0; ! 27: long secs = 3600L*24*183; /* half a year is enough */ ! 28: char *vol_id; ! 29: char errbuf[1024]; ! 30: ! 31: setvbuf(stderr, (char *)0, _IOLBF, 4096); ! 32: setvbuf(stdout, (char *)0, _IOLBF, 4096); ! 33: ARGBEGIN{ ! 34: case 'a': aflag = 1; break; ! 35: case 'e': eflag = 1; break; ! 36: case 'm': mflag = 1; break; ! 37: case 'p': pflag = 1; break; ! 38: case 'r': rflag = 1; break; ! 39: case 'R': reset = 1; break; ! 40: case 's': sflag = 1; break; ! 41: case 'u': uflag = 1; break; ! 42: case 'U': Uflag = 1; break; ! 43: case 'w': secs = atol(ARGF()); break; ! 44: case 'W': warm = 1; break; ! 45: default: usage(); break; ! 46: }ARGEND ! 47: s_id = 2; ! 48: j_init(&jukebox); ! 49: if(j_config(&jukebox, errbuf) < 0) ! 50: goto scram; ! 51: if(!aflag&&!eflag&&!mflag&&!pflag&&!rflag&&!uflag&&!Uflag) ! 52: sflag = 1; ! 53: vol_id = argc? argv[0] : 0; ! 54: if(reset) ! 55: soft_reset(); ! 56: if(uflag || Uflag) ! 57: unload(Uflag); ! 58: if(eflag){ ! 59: if(vol_id == 0){ ! 60: strcpy(errbuf, "-e needs a vol_id"); ! 61: goto scram; ! 62: } ! 63: if(eject(&jukebox, vol_id, errbuf)) ! 64: goto scram; ! 65: } ! 66: if(rflag){ ! 67: if(j_cold(&jukebox, vol_id? vol_id : "u", errbuf) < 0) ! 68: goto scram; ! 69: } ! 70: if(warm){ ! 71: if(j_warm(&jukebox, errbuf) < 0) ! 72: goto scram; ! 73: } ! 74: if(aflag){ ! 75: if(vol_id == 0){ ! 76: strcpy(errbuf, "-a needs a vol_id"); ! 77: goto scram; ! 78: } ! 79: if(allocate(&jukebox, vol_id, errbuf)) ! 80: goto scram; ! 81: } ! 82: if(mflag){ ! 83: if((c = j_load(&jukebox, vol_id, errbuf, secs)) < 0) ! 84: goto scram; ! 85: if(j_start(c, errbuf) < 0) ! 86: fprintf(stderr, "jukebox: %s\n", errbuf); ! 87: if(j_stop(c, errbuf) < 0) ! 88: fprintf(stderr, "jukebox: %s\n", errbuf); ! 89: printf("%d\n", c); ! 90: } ! 91: if(sflag) ! 92: prstatus(); ! 93: if(pflag){ ! 94: if(j_rdshelves(&jukebox, errbuf) < 0) ! 95: goto scram; ! 96: for(c = 0; c < jukebox.nshelves; c++) ! 97: if(jukebox.names[c]) ! 98: printf("%d: %s\n", c, jukebox.names[c]); ! 99: } ! 100: if(j_wrshelf) ! 101: if(j_wrshelves(&jukebox, errbuf)) ! 102: errexit(errbuf); ! 103: exit(0); ! 104: scram: ! 105: if(j_wrshelf) ! 106: j_wrshelves(&jukebox, errbuf); ! 107: errexit(errbuf); ! 108: return(1); /* shut up compiler */ ! 109: } ! 110: ! 111: static void ! 112: usage(void) ! 113: { ! 114: fprintf(stderr, "Usage: jukebox [-aemprsuU] [-w secs] [vol_id\n"); ! 115: exit(1); ! 116: } ! 117: ! 118: static void ! 119: errexit(char *errbuf) ! 120: { ! 121: fprintf(stderr, "jukebox: %s\n", errbuf); ! 122: exit(1); ! 123: } ! 124: ! 125: static void ! 126: prstatus(void) ! 127: { ! 128: struct lun *lun; ! 129: int c; ! 130: char errbuf[1024]; ! 131: ! 132: if(j_drstatus(&jukebox, errbuf)){ ! 133: fprintf(stderr, "jukebox: %s\n", errbuf); ! 134: exit(1); ! 135: } ! 136: for(c = 0, lun = jukebox.luns; c < jukebox.nluns; c++, lun++){ ! 137: if(!lun->occupied) ! 138: continue; ! 139: printf("lun %d(%s,%sline): ", c, lun->desc, lun->spunup?"on":"off"); ! 140: if(lun->shelf >= 0){ ! 141: printf("%s%c", j_name(&jukebox, lun->shelf), "ab"[lun->side]); ! 142: } else ! 143: printf("<unknown shelf??>"); ! 144: printf("\n"); ! 145: } ! 146: } ! 147: ! 148: static void ! 149: unload(int force) ! 150: { ! 151: struct lun *l; ! 152: int c; ! 153: char errbuf[1024]; ! 154: ! 155: if(j_drstatus(&jukebox, errbuf)){ ! 156: fprintf(stderr, "jukebox: %s\n", errbuf); ! 157: exit(1); ! 158: } ! 159: for(c = 0, l = jukebox.luns; c < 8; c++, l++){ ! 160: if(l->occupied && (force || !l->spunup)) ! 161: if(j_dr_to_sh(c, -1, SIDEA, errbuf)) ! 162: fprintf(stderr, "jukebox: %s\n", errbuf); ! 163: } ! 164: } ! 165: ! 166: static ! 167: eject(Jukebox *j, char *vol_id, char *errbuf) ! 168: { ! 169: int sh; ! 170: int dr; ! 171: ! 172: if(j_rdshelves(j, errbuf)) ! 173: return(-1); ! 174: if(j_drstatus(j, errbuf)){ ! 175: fprintf(stderr, "jukebox: %s\n", errbuf); ! 176: exit(1); ! 177: } ! 178: sh = j_shelfof(j, vol_id); ! 179: if(sh < 0){ ! 180: sprintf(errbuf, "no vol_id %s", vol_id); ! 181: return(-1); ! 182: } ! 183: j_wrshelf = 1; ! 184: if((dr = j_driveof(j, vol_id)) >= 0){ ! 185: j_wrshelf = 1; ! 186: j->shelves[sh] = 0; ! 187: j->names[sh] = 0; ! 188: return(j_eject(dr, errbuf)); ! 189: } ! 190: dr = j->nluns-1; ! 191: if(j_sh_to_dr(sh, SIDEA, dr, errbuf) < 0) ! 192: return(-1); ! 193: if(j_eject(dr, errbuf)) ! 194: return(-1); ! 195: j_wrshelf = 1; ! 196: j->shelves[sh] = 0; ! 197: j->names[sh] = 0; ! 198: return(0); ! 199: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.