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