129529Ssam #ifndef lint
2*34667Skarels static char sccsid[] = "@(#)correct.c 1.3 (Berkeley/CCI) 06/07/88";
329529Ssam #endif
429529Ssam
529529Ssam #include "vdfmt.h"
629529Ssam #include "cmd.h"
729529Ssam
829529Ssam /*
929529Ssam **
1029529Ssam */
1129529Ssam
correct()1229529Ssam correct()
1329529Ssam {
1429529Ssam cur.state = cor;
1529529Ssam print("Making corrections to bad sector map on ");
1629529Ssam printf("controller %d, drive %d, ", cur.controller, cur.drive);
1732662Skarels printf("type %s.\n", lab->d_typename);
1829529Ssam
1929529Ssam indent();
2029529Ssam if(is_formatted() == true)
2129529Ssam if(read_bad_sector_map() == true) {
2229529Ssam get_corrections();
23*34667Skarels cur.substate = sub_wmap;
2429529Ssam sync_bad_sector_map();
2529529Ssam }
2629529Ssam else
2729529Ssam print("There is no bad sector map on this drive!\n");
2829529Ssam else
2929529Ssam print("Drive must be formatted befor corrections are done.\n");
3029529Ssam exdent(1);
3129529Ssam }
3229529Ssam
3329529Ssam
3429529Ssam /*
3529529Ssam **
3629529Ssam */
3729529Ssam
cor_help()3829529Ssam cor_help()
3929529Ssam {
4029529Ssam indent();
4129529Ssam print("Correction commands are in the following form:\n");
4229529Ssam indent();
4329529Ssam print("ID - Correct module serial number.\n");
4429529Ssam print("[a-h] (block) - UNIX file system format.\n");
4529529Ssam print("SEctor (sector) - Absolute sector number on disk.\n");
4629529Ssam print("Track (track) - Absolute disk track number.\n");
4729529Ssam print("(cylinder) (head) (offset) (length) - CDC flaw map format.\n");
48*34667Skarels print("CLEAR - Remove all relocations not from flaw map.\n");
4929529Ssam print("STARt - Ends correction process.\n\n");
5029529Ssam exdent(2);
5129529Ssam }
5229529Ssam
5329529Ssam
5429529Ssam /*
5529529Ssam **
5629529Ssam */
5729529Ssam
get_corrections()5829529Ssam get_corrections()
5929529Ssam {
6029529Ssam extern int id_help();
6129529Ssam char line[256];
6229529Ssam char *ptr;
6329529Ssam bs_entry entry;
6429529Ssam dskadr dskaddr;
65*34667Skarels fmt_err dskerr;
6629529Ssam int max_track;
67*34667Skarels register int block;
6829529Ssam
6932662Skarels dskaddr.cylinder = lab->d_ncylinders - 1;
7032662Skarels dskaddr.cylinder = lab->d_ntracks - 1;
7129529Ssam max_track = to_track(dskaddr);
7229529Ssam indent();
7329529Ssam for(;;) {
7429529Ssam print("Location? ");
7529529Ssam get_string_cmd(line, cor_help);
7629529Ssam if(kill_processes == true)
7729529Ssam break;
7829529Ssam if(line[0] == '\0')
7929529Ssam continue;
8029529Ssam ptr = line;
8129529Ssam trim_white(ptr);
8229529Ssam if(!strncmp(ptr, "he", 2) || !strncmp(ptr, "?", 1) ||
8329529Ssam !strncmp(ptr, "stat", 4) || !strncmp(ptr, "!", 1))
8429529Ssam continue;
8529529Ssam indent();
8629529Ssam if(!strncmp(ptr, "id", 2)) {
8729529Ssam register int temp;
8829529Ssam
8929529Ssam for(;;) {
9029529Ssam print("Pack ID is %d. Change to? ",
9129529Ssam bad_map->bs_id);
9229529Ssam temp = get_digit_cmd(id_help);
9329529Ssam if(temp > 0)
9429529Ssam break;
9529529Ssam }
9632662Skarels D_INFO->id = bad_map->bs_id = temp;
97*34667Skarels } else if (!strcmp(ptr, "clear")) {
98*34667Skarels print(
99*34667Skarels "Confirm removal of ALL relocations installed manually\n");
100*34667Skarels if (get_yes_no("or by verification") == true)
101*34667Skarels clear_relocations(true);
10229529Ssam }
10329529Ssam else if((*ptr >= 'a') && (*ptr <= 'h')) {
10429529Ssam register char par = *ptr++;
105*34667Skarels
106*34667Skarels block = get_next_digit(ptr);
107*34667Skarels dskerr.err_adr = *from_unix((unsigned char)par,
10829529Ssam (unsigned int)block);
109*34667Skarels if((dskerr.err_adr.cylinder == -1) || (block == -1)) {
11029529Ssam print("Invalid UNIX block number!\n");
11129529Ssam goto next;
11229529Ssam }
11329529Ssam print("Confirm block %d on file-system '%c'",block,par);
114*34667Skarels dskerr.err_stat = DATA_ERROR;
115*34667Skarels doreloc:
116*34667Skarels printf(" (cn %d tn %d bn %d)", dskerr.err_adr.cylinder,
117*34667Skarels dskerr.err_adr.track, dskerr.err_adr.sector);
11829529Ssam if(get_yes_no("") == true) {
119*34667Skarels (*C_INFO->code_pos)(&dskerr, &entry);
120*34667Skarels remove_user_relocations(&entry);
12129529Ssam }
12229529Ssam }
12329529Ssam else if(*ptr == 't') {
124*34667Skarels block = get_next_digit(ptr);
125*34667Skarels if((block == -1) || (block >= max_track)) {
12629529Ssam print("Invalid track number!\n");
12729529Ssam goto next;
12829529Ssam }
129*34667Skarels dskerr.err_adr = *from_track(block);
130*34667Skarels dskerr.err_stat = HEADER_ERROR;
131*34667Skarels print("Confirm track %d", block);
132*34667Skarels goto doreloc;
13329529Ssam }
13429529Ssam else if(!strncmp(ptr, "se", 2)) {
135*34667Skarels block = get_next_digit(ptr);
136*34667Skarels if (block == -1 ||
137*34667Skarels block > lab->d_nsectors*lab->d_ntracks*lab->d_ncylinders) {
13829529Ssam print("Invalid sector number!\n");
13929529Ssam goto next;
14029529Ssam }
141*34667Skarels dskerr.err_adr = *from_sector((unsigned int)block);
142*34667Skarels dskerr.err_stat = DATA_ERROR;
143*34667Skarels print("Confirm sector %d", block);
144*34667Skarels goto doreloc;
14529529Ssam }
14629529Ssam else if(is_digit(*ptr)) {
14729529Ssam entry.bs_cyl = get_next_digit(ptr);
14829529Ssam skipdigits(ptr);
14929529Ssam finddigit(ptr);
15029529Ssam entry.bs_trk = get_next_digit(ptr);
15129529Ssam skipdigits(ptr);
15229529Ssam finddigit(ptr);
15329529Ssam entry.bs_offset = get_next_digit(ptr);
15429529Ssam skipdigits(ptr);
15529529Ssam finddigit(ptr);
15629529Ssam entry.bs_length = get_next_digit(ptr);
15729529Ssam if((entry.bs_trk != -1) && (entry.bs_offset != -1) &&
15829529Ssam (entry.bs_length != -1)) {
15932662Skarels if(entry.bs_cyl >= lab->d_ncylinders)
16029529Ssam print("Cylinder number to high!\n");
16132662Skarels else if(entry.bs_trk >= lab->d_ntracks)
16229529Ssam print("Head number to high!\n");
16332662Skarels else if(entry.bs_offset >= lab->d_traksize)
16429529Ssam print("Offset too long!\n");
16529529Ssam else if(entry.bs_length == 0)
16629529Ssam print("Can't have a 0 length error!\n");
16729529Ssam else {
16829529Ssam print("Confirm Cyl %d, ",entry.bs_cyl);
16929529Ssam printf("Head %d, ", entry.bs_trk);
17029529Ssam printf("offset %d, ", entry.bs_offset);
17129529Ssam printf("length %d", entry.bs_length);
17229529Ssam if(get_yes_no("") == true)
173*34667Skarels remove_user_relocations(&entry);
17429529Ssam }
17529529Ssam }
17629529Ssam else
17729529Ssam goto bad;
178*34667Skarels } else if(!strncmp(ptr, "star", 4)) {
17929529Ssam exdent(1);
18029529Ssam break;
18129529Ssam }
18229529Ssam else
18329529Ssam bad: print("What?\n");
18429529Ssam next: exdent(1);
18529529Ssam }
18629529Ssam exdent(1);
18729529Ssam }
18829529Ssam
189