BSD 4_4 release
[unix-history] / usr / src / sys / tahoe / stand / vdformat / online / correct.c
#ifndef lint
static char sccsid[] = "@(#)correct.c 1.2 (Berkeley/CCI) 11/23/87";
#endif
#include "vdfmt.h"
#include "cmd.h"
/*
**
*/
correct()
{
cur.state = cor;
print("Making corrections to bad sector map on ");
printf("controller %d, drive %d, ", cur.controller, cur.drive);
printf("type %s.\n", lab->d_typename);
indent();
if(is_formatted() == true)
if(read_bad_sector_map() == true) {
get_corrections();
sync_bad_sector_map();
}
else
print("There is no bad sector map on this drive!\n");
else
print("Drive must be formatted befor corrections are done.\n");
exdent(1);
}
/*
**
*/
cor_help()
{
indent();
print("Correction commands are in the following form:\n");
indent();
print("ID - Correct module serial number.\n");
print("[a-h] (block) - UNIX file system format.\n");
print("SEctor (sector) - Absolute sector number on disk.\n");
print("Track (track) - Absolute disk track number.\n");
print("(cylinder) (head) (offset) (length) - CDC flaw map format.\n");
print("STARt - Ends correction process.\n\n");
exdent(2);
}
/*
**
*/
get_corrections()
{
extern int id_help();
char line[256];
char *ptr;
bs_entry entry;
dskadr dskaddr;
int max_track;
dskaddr.cylinder = lab->d_ncylinders - 1;
dskaddr.cylinder = lab->d_ntracks - 1;
max_track = to_track(dskaddr);
indent();
for(;;) {
print("Location? ");
get_string_cmd(line, cor_help);
if(kill_processes == true)
break;
if(line[0] == '\0')
continue;
ptr = line;
trim_white(ptr);
if(!strncmp(ptr, "he", 2) || !strncmp(ptr, "?", 1) ||
!strncmp(ptr, "stat", 4) || !strncmp(ptr, "!", 1))
continue;
indent();
if(!strncmp(ptr, "id", 2)) {
register int temp;
for(;;) {
print("Pack ID is %d. Change to? ",
bad_map->bs_id);
temp = get_digit_cmd(id_help);
if(temp > 0)
break;
}
D_INFO->id = bad_map->bs_id = temp;
}
else if((*ptr >= 'a') && (*ptr <= 'h')) {
register char par = *ptr++;
register int block = get_next_digit(ptr);
dskaddr = *from_unix((unsigned char)par,
(unsigned int)block);
if((dskaddr.cylinder == -1) || (block == -1)) {
print("Invalid UNIX block number!\n");
goto next;
}
print("Confirm block %d on file-system '%c'",block,par);
if(get_yes_no("") == true) {
entry=(*C_INFO->code_pos)(dskaddr,HEADER_ERROR);
remove_user_relocations(entry);
}
}
else if(*ptr == 't') {
register int trk = get_next_digit(ptr);
if((trk == -1) || (trk >= max_track)) {
print("Invalid track number!\n");
goto next;
}
print("Confirm track %d", trk);
if(get_yes_no("") == true) {
dskaddr = *from_track(trk);
entry=(*C_INFO->code_pos)(dskaddr,HEADER_ERROR);
remove_user_relocations(entry);
}
}
else if(!strncmp(ptr, "se", 2)) {
register int sec = get_next_digit(ptr);
if (sec == -1 ||
sec > lab->d_nsectors*lab->d_ntracks*lab->d_ncylinders) {
print("Invalid sector number!\n");
goto next;
}
print("Confirm sector %d", sec);
if(get_yes_no("") == true) {
dskaddr = *from_sector((unsigned int)sec);
entry = (*C_INFO->code_pos)(dskaddr, DATA_ERROR);
remove_user_relocations(entry);
}
}
else if(is_digit(*ptr)) {
entry.bs_cyl = get_next_digit(ptr);
skipdigits(ptr);
finddigit(ptr);
entry.bs_trk = get_next_digit(ptr);
skipdigits(ptr);
finddigit(ptr);
entry.bs_offset = get_next_digit(ptr);
skipdigits(ptr);
finddigit(ptr);
entry.bs_length = get_next_digit(ptr);
if((entry.bs_trk != -1) && (entry.bs_offset != -1) &&
(entry.bs_length != -1)) {
if(entry.bs_cyl >= lab->d_ncylinders)
print("Cylinder number to high!\n");
else if(entry.bs_trk >= lab->d_ntracks)
print("Head number to high!\n");
else if(entry.bs_offset >= lab->d_traksize)
print("Offset too long!\n");
else if(entry.bs_length == 0)
print("Can't have a 0 length error!\n");
else {
print("Confirm Cyl %d, ",entry.bs_cyl);
printf("Head %d, ", entry.bs_trk);
printf("offset %d, ", entry.bs_offset);
printf("length %d", entry.bs_length);
if(get_yes_no("") == true)
remove_user_relocations(entry);
}
}
else
goto bad;
}
else if(!strncmp(ptr, "star", 4)) {
exdent(1);
break;
}
else
bad: print("What?\n");
next: exdent(1);
}
write_bad_sector_map();
exdent(1);
}