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 
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 
189