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