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