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