static char sccsid
[] = "@(#)correct.c 1.2 (Berkeley/CCI) 11/23/87";
print("Making corrections to bad sector map on ");
printf("controller %d, drive %d, ", cur
.controller
, cur
.drive
);
printf("type %s.\n", lab
->d_typename
);
if(is_formatted() == true)
if(read_bad_sector_map() == true) {
print("There is no bad sector map on this drive!\n");
print("Drive must be formatted befor corrections are done.\n");
print("Correction commands are in the following form:\n");
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");
dskaddr
.cylinder
= lab
->d_ncylinders
- 1;
dskaddr
.cylinder
= lab
->d_ntracks
- 1;
max_track
= to_track(dskaddr
);
get_string_cmd(line
, cor_help
);
if(kill_processes
== true)
if(!strncmp(ptr
, "he", 2) || !strncmp(ptr
, "?", 1) ||
!strncmp(ptr
, "stat", 4) || !strncmp(ptr
, "!", 1))
if(!strncmp(ptr
, "id", 2)) {
print("Pack ID is %d. Change to? ",
temp
= get_digit_cmd(id_help
);
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
,
if((dskaddr
.cylinder
== -1) || (block
== -1)) {
print("Invalid UNIX block number!\n");
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
);
register int trk
= get_next_digit(ptr
);
if((trk
== -1) || (trk
>= max_track
)) {
print("Invalid track number!\n");
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
);
sec
> lab
->d_nsectors
*lab
->d_ntracks
*lab
->d_ncylinders
) {
print("Invalid sector number!\n");
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
);
entry
.bs_trk
= get_next_digit(ptr
);
entry
.bs_offset
= get_next_digit(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");
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 if(!strncmp(ptr
, "star", 4)) {