|
|
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.