|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.