4.4BSD/usr/src/sys/tahoe/stand/vdformat/online/correct.c

Compare this file to the similar file:
Show the results in this format:

#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);
}