1 #ifndef lint
2 static char sccsid[] = "@(#)correct.c 1.3 (Berkeley/CCI) 06/07/88";
3 #endif
4
5 #include "vdfmt.h"
6 #include "cmd.h"
7
8 /*
9 **
10 */
11
correct()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
cor_help()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
get_corrections()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
189