|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)proc_cmd.c 1.4 (Berkeley/CCI) 11/23/87";
3: #endif
4:
5: #include "vdfmt.h"
6: #include "cmd.h"
7:
8: #define RESET 1
9: #define LIST 2
10: #define DELETE 3
11: #define FORMAT 4
12: #define VERIFY 5
13: #define RELOCATE 6
14: #define CORRECT 7
15: #define INFO 8
16: #define PROFILE 9
17: #define EXERCISE 10
18: #define START 11
19: #define EXIT 12
20:
21: static cmd_text_element commands[] = {
22: { RESET, "RESET", "Reinitialize VDFORMAT, and start over" },
23: { EXIT, "EXIT", "Terminate program" },
24: { LIST, "List", "List operations specified so far" },
25: { DELETE, "Delete", "Delete specific operations" },
26: { FORMAT, "Format", "Format and verify disk surface" },
27: { VERIFY, "Verify", "Destructively verify disk surface" },
28: { RELOCATE, "Relocate", "Add known flaws to bad sector map" },
29: { CORRECT, "Correct", "Correct erroneous relocations or drive ID" },
30: { INFO, "Info", "Display known disk information" },
31: { PROFILE, "Profile", "Display seek profile graph of disk" },
32: { EXERCISE, "Exercise", "Perform seek exercises on disk" },
33: { START, "STARt", "Start operations" },
34: { 0, "", "" }
35: };
36:
37:
38: /*
39: **
40: */
41:
42: process_commands()
43: {
44: int tokens[20];
45: int *tok_ptr, count;
46: int op_mask = 0;
47: char *cptr;
48: boolean should_start = false;
49:
50: for(;;) {
51: (void)_setjmp(abort_environ);
52: cur.state = cmd;
53: kill_processes = false;
54: exdent(-1);
55: op_mask = 0;
56: printf("vdformat> ");
57: count = get_text_cmd(commands, tokens);
58: if(kill_processes == true)
59: _longjmp(quit_environ, 1);
60: tok_ptr = tokens;
61: if((*tok_ptr == 0) || !count)
62: continue;
63: while(*tok_ptr) {
64: switch (*tok_ptr) {
65: case RESET :
66: reset();
67: break;
68: case LIST :
69: list();
70: break;
71: case DELETE :
72: delete();
73: break;
74: case FORMAT :
75: op_mask |= FORMAT_OP;
76: break;
77: case VERIFY :
78: op_mask |= VERIFY_OP;
79: break;
80: case RELOCATE :
81: op_mask |= RELOCATE_OP;
82: break;
83: case CORRECT :
84: op_mask |= CORRECT_OP;
85: break;
86: case INFO :
87: op_mask |= INFO_OP;
88: break;
89: case PROFILE :
90: op_mask |= PROFILE_OP;
91: break;
92: case EXERCISE :
93: op_mask |= EXERCISE_OP;
94: break;
95: case START :
96: should_start = true;
97: break;
98: case EXIT:
99: exit(0);
100: /*NOTREACHED*/
101: default: /* ignore */
102: break;
103: }
104: tok_ptr++;
105: }
106: if(op_mask) {
107: get_drive_parameters(op_mask);
108: }
109: if(should_start) {
110: start_commands();
111: should_start = false;
112: }
113: }
114: }
115:
116:
117: /*
118: **
119: */
120:
121: static boolean header_printed = false;
122:
123: get_drive_parameters(op_mask)
124: int op_mask;
125: {
126: int c_list[20], i, num_pat;
127:
128: indent();
129: header_printed = false;
130: get_ctlr_list(c_list, op_mask);
131: if(kill_processes == true) {
132: kill_processes = false;
133: c_list[0]= -1;
134: }
135: for(i=0; c_list[i] != -1; i++) {
136: int d_list[40], j;
137:
138: indent();
139: get_drive_list(c_list[i], d_list, op_mask);
140: if(kill_processes == true) {
141: kill_processes = false;
142: break;
143: }
144: indent();
145: if(op_mask & (FORMAT_OP | VERIFY_OP)) {
146: num_pat = get_num_pat();
147: if(kill_processes == true) {
148: kill_processes = false;
149: break;
150: }
151: }
152: for(j=0; d_list[j] != -1; j++) {
153: cur.controller = c_list[i];
154: cur.drive = d_list[j];
155: C_INFO = &c_info[cur.controller];
156: D_INFO = &d_info[cur.controller][cur.drive];
157: lab = &D_INFO->label;
158: get_drive_type(cur.controller, cur.drive, op_mask);
159: if(kill_processes == true) {
160: kill_processes = false;
161: break;
162: }
163: if(op_mask & ~INFO_OP) {
164: indent();
165: get_drive_id(c_list[i], d_list[j]);
166: if(kill_processes == true) {
167: kill_processes = false;
168: break;
169: }
170: exdent(1);
171: }
172: ops_to_do[c_list[i]][d_list[j]].op |= op_mask;
173: if(op_mask & (FORMAT_OP | VERIFY_OP))
174: ops_to_do[c_list[i]][d_list[j]].numpat=num_pat;
175: }
176: exdent(1);
177: }
178: exdent(2);
179: }
180:
181: /*
182: **
183: */
184:
185: get_ctlr_list(c_list, op_mask)
186: int *c_list, op_mask;
187: {
188: extern int ctlr_help();
189: register int i, ctlr;
190: int table[MAXCTLR+10];
191:
192: i = 0;
193: for(ctlr=0; ctlr<MAXCTLR; ctlr++)
194: if(c_info[ctlr].alive == u_true)
195: table[i++] = ctlr;
196: table[i] = -1;
197: /* If only one controller is possible don't ask */
198: if(table[1] == -1) {
199: *c_list++ = table[0];
200: *c_list = -1;
201: return;
202: }
203: for(;;) {
204: header_printed = true;
205: print(""); /* Force indent */
206: print_op_list(op_mask);
207: printf(" on which controllers? ");
208: get_digit_list(c_list, table, ctlr_help);
209: if(kill_processes == true)
210: return;
211: if(*c_list != -1)
212: break;
213: }
214: }
215:
216:
217: /*
218: **
219: */
220:
221: ctlr_help()
222: {
223: register int ctlr;
224:
225: indent();
226: print("The following controllers are attached to the system:\n");
227: indent();
228: for(ctlr=0; ctlr<MAXCTLR; ctlr++)
229: if(c_info[ctlr].alive == u_true) {
230: print("Controller %d, which is a%s %s controller.\n",
231: ctlr, (c_info[ctlr].name[0] == 'S') ? "n" : "",
232: c_info[ctlr].name);
233: }
234: print("\n");
235: exdent(2);
236: }
237:
238: static int max_drive = 0;
239:
240: /*
241: **
242: */
243:
244: get_drive_list(ctlr, d_list, op_mask)
245: int ctlr, *d_list, op_mask;
246: {
247: extern int drive_help();
248: int table[MAXDRIVE+10];
249: int i;
250:
251: max_drive = (c_info[ctlr].type == VDTYPE_VDDC) ? 4 : 16;
252: for(i=0; i<max_drive; i++)
253: table[i] = i;
254: table[i] = -1;
255: for(;;) {
256: if(header_printed == true)
257: print("Drives on controller %d? ", ctlr);
258: else {
259: header_printed = true;
260: print(""); /* Force indent */
261: print_op_list(op_mask);
262: printf(" on which drives? ");
263: }
264: get_digit_list(d_list, table, drive_help);
265: if(kill_processes == true)
266: return;
267: if(*d_list != -1)
268: break;
269: }
270: }
271:
272: /*
273: **
274: */
275:
276: id_help()
277: {
278: indent();
279: print("The following commands are available:\n");
280: indent();
281: print("STATus - Display formatter state.\n");
282: print("QUIT - Terminate current operation.\n");
283: print("");
284: print("A module serial can be any number greater than zero.\n");
285: exdent(2);
286: }
287:
288:
289: /*
290: **
291: */
292:
293: get_drive_id(ctlr, drive)
294: int ctlr, drive;
295: {
296: int new_id;
297:
298: for(;;) {
299: print("Module serial number for controller %d, drive %d? ",
300: ctlr, drive);
301: if(d_info[ctlr][drive].id != -1)
302: printf("(%d) ", d_info[ctlr][drive].id);
303: new_id = get_digit_cmd(id_help);
304: if(new_id > 0) {
305: d_info[ctlr][drive].id = new_id;
306: break;
307: }
308: else if(d_info[ctlr][drive].id != -1)
309: break;
310: }
311: }
312:
313:
314: /*
315: **
316: */
317:
318: drive_help()
319: {
320: indent();
321: print("Drive numbers 0 through %d may be entered.\n", max_drive-1);
322: exdent(1);
323: }
324:
325:
326: /*
327: **
328: */
329:
330: pat_help()
331: {
332: indent();
333: print("Between 0 and 16 patterns may be used while verifying.\n");
334: exdent(1);
335: }
336:
337:
338: /*
339: **
340: */
341:
342: get_num_pat()
343: {
344: int table[17+10];
345: int results[17+10];
346: int i;
347:
348: for(i=0; i<=16; i++)
349: table[i] = i;
350: table[i] = -1;
351: for(;;) {
352: print("Number of patterns to use while verifying? ");
353: get_digit_list(results, table, pat_help);
354: if(kill_processes == true)
355: return 0;
356: if(results[0] != -1)
357: break;
358: }
359: return results[0];
360: }
361:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.