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