|
|
BSD 4.3tahoe
#ifndef lint
static char sccsid[] = "@(#)proc_cmd.c 1.4 (Berkeley/CCI) 11/23/87";
#endif
#include "vdfmt.h"
#include "cmd.h"
#define RESET 1
#define LIST 2
#define DELETE 3
#define FORMAT 4
#define VERIFY 5
#define RELOCATE 6
#define CORRECT 7
#define INFO 8
#define PROFILE 9
#define EXERCISE 10
#define START 11
#define EXIT 12
static cmd_text_element commands[] = {
{ RESET, "RESET", "Reinitialize VDFORMAT, and start over" },
{ EXIT, "EXIT", "Terminate program" },
{ LIST, "List", "List operations specified so far" },
{ DELETE, "Delete", "Delete specific operations" },
{ FORMAT, "Format", "Format and verify disk surface" },
{ VERIFY, "Verify", "Destructively verify disk surface" },
{ RELOCATE, "Relocate", "Add known flaws to bad sector map" },
{ CORRECT, "Correct", "Correct erroneous relocations or drive ID" },
{ INFO, "Info", "Display known disk information" },
{ PROFILE, "Profile", "Display seek profile graph of disk" },
{ EXERCISE, "Exercise", "Perform seek exercises on disk" },
{ START, "STARt", "Start operations" },
{ 0, "", "" }
};
/*
**
*/
process_commands()
{
int tokens[20];
int *tok_ptr, count;
int op_mask = 0;
char *cptr;
boolean should_start = false;
for(;;) {
(void)_setjmp(abort_environ);
cur.state = cmd;
kill_processes = false;
exdent(-1);
op_mask = 0;
printf("vdformat> ");
count = get_text_cmd(commands, tokens);
if(kill_processes == true)
_longjmp(quit_environ, 1);
tok_ptr = tokens;
if((*tok_ptr == 0) || !count)
continue;
while(*tok_ptr) {
switch (*tok_ptr) {
case RESET :
reset();
break;
case LIST :
list();
break;
case DELETE :
delete();
break;
case FORMAT :
op_mask |= FORMAT_OP;
break;
case VERIFY :
op_mask |= VERIFY_OP;
break;
case RELOCATE :
op_mask |= RELOCATE_OP;
break;
case CORRECT :
op_mask |= CORRECT_OP;
break;
case INFO :
op_mask |= INFO_OP;
break;
case PROFILE :
op_mask |= PROFILE_OP;
break;
case EXERCISE :
op_mask |= EXERCISE_OP;
break;
case START :
should_start = true;
break;
case EXIT:
exit(0);
/*NOTREACHED*/
default: /* ignore */
break;
}
tok_ptr++;
}
if(op_mask) {
get_drive_parameters(op_mask);
}
if(should_start) {
start_commands();
should_start = false;
}
}
}
/*
**
*/
static boolean header_printed = false;
get_drive_parameters(op_mask)
int op_mask;
{
int c_list[20], i, num_pat;
indent();
header_printed = false;
get_ctlr_list(c_list, op_mask);
if(kill_processes == true) {
kill_processes = false;
c_list[0]= -1;
}
for(i=0; c_list[i] != -1; i++) {
int d_list[40], j;
indent();
get_drive_list(c_list[i], d_list, op_mask);
if(kill_processes == true) {
kill_processes = false;
break;
}
indent();
if(op_mask & (FORMAT_OP | VERIFY_OP)) {
num_pat = get_num_pat();
if(kill_processes == true) {
kill_processes = false;
break;
}
}
for(j=0; d_list[j] != -1; j++) {
cur.controller = c_list[i];
cur.drive = d_list[j];
C_INFO = &c_info[cur.controller];
D_INFO = &d_info[cur.controller][cur.drive];
lab = &D_INFO->label;
get_drive_type(cur.controller, cur.drive, op_mask);
if(kill_processes == true) {
kill_processes = false;
break;
}
if(op_mask & ~INFO_OP) {
indent();
get_drive_id(c_list[i], d_list[j]);
if(kill_processes == true) {
kill_processes = false;
break;
}
exdent(1);
}
ops_to_do[c_list[i]][d_list[j]].op |= op_mask;
if(op_mask & (FORMAT_OP | VERIFY_OP))
ops_to_do[c_list[i]][d_list[j]].numpat=num_pat;
}
exdent(1);
}
exdent(2);
}
/*
**
*/
get_ctlr_list(c_list, op_mask)
int *c_list, op_mask;
{
extern int ctlr_help();
register int i, ctlr;
int table[MAXCTLR+10];
i = 0;
for(ctlr=0; ctlr<MAXCTLR; ctlr++)
if(c_info[ctlr].alive == u_true)
table[i++] = ctlr;
table[i] = -1;
/* If only one controller is possible don't ask */
if(table[1] == -1) {
*c_list++ = table[0];
*c_list = -1;
return;
}
for(;;) {
header_printed = true;
print(""); /* Force indent */
print_op_list(op_mask);
printf(" on which controllers? ");
get_digit_list(c_list, table, ctlr_help);
if(kill_processes == true)
return;
if(*c_list != -1)
break;
}
}
/*
**
*/
ctlr_help()
{
register int ctlr;
indent();
print("The following controllers are attached to the system:\n");
indent();
for(ctlr=0; ctlr<MAXCTLR; ctlr++)
if(c_info[ctlr].alive == u_true) {
print("Controller %d, which is a%s %s controller.\n",
ctlr, (c_info[ctlr].name[0] == 'S') ? "n" : "",
c_info[ctlr].name);
}
print("\n");
exdent(2);
}
static int max_drive = 0;
/*
**
*/
get_drive_list(ctlr, d_list, op_mask)
int ctlr, *d_list, op_mask;
{
extern int drive_help();
int table[MAXDRIVE+10];
int i;
max_drive = (c_info[ctlr].type == VDTYPE_VDDC) ? 4 : 16;
for(i=0; i<max_drive; i++)
table[i] = i;
table[i] = -1;
for(;;) {
if(header_printed == true)
print("Drives on controller %d? ", ctlr);
else {
header_printed = true;
print(""); /* Force indent */
print_op_list(op_mask);
printf(" on which drives? ");
}
get_digit_list(d_list, table, drive_help);
if(kill_processes == true)
return;
if(*d_list != -1)
break;
}
}
/*
**
*/
id_help()
{
indent();
print("The following commands are available:\n");
indent();
print("STATus - Display formatter state.\n");
print("QUIT - Terminate current operation.\n");
print("");
print("A module serial can be any number greater than zero.\n");
exdent(2);
}
/*
**
*/
get_drive_id(ctlr, drive)
int ctlr, drive;
{
int new_id;
for(;;) {
print("Module serial number for controller %d, drive %d? ",
ctlr, drive);
if(d_info[ctlr][drive].id != -1)
printf("(%d) ", d_info[ctlr][drive].id);
new_id = get_digit_cmd(id_help);
if(new_id > 0) {
d_info[ctlr][drive].id = new_id;
break;
}
else if(d_info[ctlr][drive].id != -1)
break;
}
}
/*
**
*/
drive_help()
{
indent();
print("Drive numbers 0 through %d may be entered.\n", max_drive-1);
exdent(1);
}
/*
**
*/
pat_help()
{
indent();
print("Between 0 and 16 patterns may be used while verifying.\n");
exdent(1);
}
/*
**
*/
get_num_pat()
{
int table[17+10];
int results[17+10];
int i;
for(i=0; i<=16; i++)
table[i] = i;
table[i] = -1;
for(;;) {
print("Number of patterns to use while verifying? ");
get_digit_list(results, table, pat_help);
if(kill_processes == true)
return 0;
if(results[0] != -1)
break;
}
return results[0];
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.