|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)correct.c 1.3 (Berkeley/CCI) 6/7/88"; ! 3: #endif ! 4: ! 5: #include "vdfmt.h" ! 6: #include "cmd.h" ! 7: ! 8: /* ! 9: ** ! 10: */ ! 11: ! 12: correct() ! 13: { ! 14: cur.state = cor; ! 15: print("Making corrections to bad sector map on "); ! 16: printf("controller %d, drive %d, ", cur.controller, cur.drive); ! 17: printf("type %s.\n", lab->d_typename); ! 18: ! 19: indent(); ! 20: if(is_formatted() == true) ! 21: if(read_bad_sector_map() == true) { ! 22: get_corrections(); ! 23: cur.substate = sub_wmap; ! 24: sync_bad_sector_map(); ! 25: } ! 26: else ! 27: print("There is no bad sector map on this drive!\n"); ! 28: else ! 29: print("Drive must be formatted befor corrections are done.\n"); ! 30: exdent(1); ! 31: } ! 32: ! 33: ! 34: /* ! 35: ** ! 36: */ ! 37: ! 38: cor_help() ! 39: { ! 40: indent(); ! 41: print("Correction commands are in the following form:\n"); ! 42: indent(); ! 43: print("ID - Correct module serial number.\n"); ! 44: print("[a-h] (block) - UNIX file system format.\n"); ! 45: print("SEctor (sector) - Absolute sector number on disk.\n"); ! 46: print("Track (track) - Absolute disk track number.\n"); ! 47: print("(cylinder) (head) (offset) (length) - CDC flaw map format.\n"); ! 48: print("CLEAR - Remove all relocations not from flaw map.\n"); ! 49: print("STARt - Ends correction process.\n\n"); ! 50: exdent(2); ! 51: } ! 52: ! 53: ! 54: /* ! 55: ** ! 56: */ ! 57: ! 58: get_corrections() ! 59: { ! 60: extern int id_help(); ! 61: char line[256]; ! 62: char *ptr; ! 63: bs_entry entry; ! 64: dskadr dskaddr; ! 65: fmt_err dskerr; ! 66: int max_track; ! 67: register int block; ! 68: ! 69: dskaddr.cylinder = lab->d_ncylinders - 1; ! 70: dskaddr.cylinder = lab->d_ntracks - 1; ! 71: max_track = to_track(dskaddr); ! 72: indent(); ! 73: for(;;) { ! 74: print("Location? "); ! 75: get_string_cmd(line, cor_help); ! 76: if(kill_processes == true) ! 77: break; ! 78: if(line[0] == '\0') ! 79: continue; ! 80: ptr = line; ! 81: trim_white(ptr); ! 82: if(!strncmp(ptr, "he", 2) || !strncmp(ptr, "?", 1) || ! 83: !strncmp(ptr, "stat", 4) || !strncmp(ptr, "!", 1)) ! 84: continue; ! 85: indent(); ! 86: if(!strncmp(ptr, "id", 2)) { ! 87: register int temp; ! 88: ! 89: for(;;) { ! 90: print("Pack ID is %d. Change to? ", ! 91: bad_map->bs_id); ! 92: temp = get_digit_cmd(id_help); ! 93: if(temp > 0) ! 94: break; ! 95: } ! 96: D_INFO->id = bad_map->bs_id = temp; ! 97: } else if (!strcmp(ptr, "clear")) { ! 98: print( ! 99: "Confirm removal of ALL relocations installed manually\n"); ! 100: if (get_yes_no("or by verification") == true) ! 101: clear_relocations(true); ! 102: } ! 103: else if((*ptr >= 'a') && (*ptr <= 'h')) { ! 104: register char par = *ptr++; ! 105: ! 106: block = get_next_digit(ptr); ! 107: dskerr.err_adr = *from_unix((unsigned char)par, ! 108: (unsigned int)block); ! 109: if((dskerr.err_adr.cylinder == -1) || (block == -1)) { ! 110: print("Invalid UNIX block number!\n"); ! 111: goto next; ! 112: } ! 113: print("Confirm block %d on file-system '%c'",block,par); ! 114: dskerr.err_stat = DATA_ERROR; ! 115: doreloc: ! 116: printf(" (cn %d tn %d bn %d)", dskerr.err_adr.cylinder, ! 117: dskerr.err_adr.track, dskerr.err_adr.sector); ! 118: if(get_yes_no("") == true) { ! 119: (*C_INFO->code_pos)(&dskerr, &entry); ! 120: remove_user_relocations(&entry); ! 121: } ! 122: } ! 123: else if(*ptr == 't') { ! 124: block = get_next_digit(ptr); ! 125: if((block == -1) || (block >= max_track)) { ! 126: print("Invalid track number!\n"); ! 127: goto next; ! 128: } ! 129: dskerr.err_adr = *from_track(block); ! 130: dskerr.err_stat = HEADER_ERROR; ! 131: print("Confirm track %d", block); ! 132: goto doreloc; ! 133: } ! 134: else if(!strncmp(ptr, "se", 2)) { ! 135: block = get_next_digit(ptr); ! 136: if (block == -1 || ! 137: block > lab->d_nsectors*lab->d_ntracks*lab->d_ncylinders) { ! 138: print("Invalid sector number!\n"); ! 139: goto next; ! 140: } ! 141: dskerr.err_adr = *from_sector((unsigned int)block); ! 142: dskerr.err_stat = DATA_ERROR; ! 143: print("Confirm sector %d", block); ! 144: goto doreloc; ! 145: } ! 146: else if(is_digit(*ptr)) { ! 147: entry.bs_cyl = get_next_digit(ptr); ! 148: skipdigits(ptr); ! 149: finddigit(ptr); ! 150: entry.bs_trk = get_next_digit(ptr); ! 151: skipdigits(ptr); ! 152: finddigit(ptr); ! 153: entry.bs_offset = get_next_digit(ptr); ! 154: skipdigits(ptr); ! 155: finddigit(ptr); ! 156: entry.bs_length = get_next_digit(ptr); ! 157: if((entry.bs_trk != -1) && (entry.bs_offset != -1) && ! 158: (entry.bs_length != -1)) { ! 159: if(entry.bs_cyl >= lab->d_ncylinders) ! 160: print("Cylinder number to high!\n"); ! 161: else if(entry.bs_trk >= lab->d_ntracks) ! 162: print("Head number to high!\n"); ! 163: else if(entry.bs_offset >= lab->d_traksize) ! 164: print("Offset too long!\n"); ! 165: else if(entry.bs_length == 0) ! 166: print("Can't have a 0 length error!\n"); ! 167: else { ! 168: print("Confirm Cyl %d, ",entry.bs_cyl); ! 169: printf("Head %d, ", entry.bs_trk); ! 170: printf("offset %d, ", entry.bs_offset); ! 171: printf("length %d", entry.bs_length); ! 172: if(get_yes_no("") == true) ! 173: remove_user_relocations(&entry); ! 174: } ! 175: } ! 176: else ! 177: goto bad; ! 178: } else if(!strncmp(ptr, "star", 4)) { ! 179: exdent(1); ! 180: break; ! 181: } ! 182: else ! 183: bad: print("What?\n"); ! 184: next: exdent(1); ! 185: } ! 186: exdent(1); ! 187: } ! 188:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.