diff options
Diffstat (limited to 'private/mvdm/softpc.new/host/src/stf_conf.c')
-rw-r--r-- | private/mvdm/softpc.new/host/src/stf_conf.c | 927 |
1 files changed, 927 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/host/src/stf_conf.c b/private/mvdm/softpc.new/host/src/stf_conf.c new file mode 100644 index 000000000..ae0932398 --- /dev/null +++ b/private/mvdm/softpc.new/host/src/stf_conf.c @@ -0,0 +1,927 @@ +/* + * SoftPC Revision 3.0 + * + * + * Title : Host dependent configuration panel functions + * + * + * Description : This module forms the host dependant side of the softpc + * configuration system. + * + * + * Author : Wilf Stubs + * + * + * Notes : + * + */ +#include "insignia.h" +#include "host_dfs.h" + +#include <stdio.h> +#include <string.h> + +#include "xt.h" +#include "error.h" +#include "gfi.h" +#include "gmi.h" +#include "gfx_updt.h" +#include "config.h" +#include "rs232.h" +#include "host_lpt.h" +#include "host_cpu.h" +#include "host_com.h" +#include "nt_confg.h" + +/*********** Private definitions ***********************/ + +/* + * Validation routines + */ + +static short validate_c_drive(); +static short validate_d_drive(); +static short validate_com1(); +static short validate_com2(); +static short validate_lpt1(); +static short validate_lpt2(); +#if (NUM_PARALLEL_PORTS>2) +static short validate_lpt3(); +#endif +static short validate_item(); +static short no_validation(); + +/* + * Change action routines + */ + +static short c_drive_change_action(); +static short d_drive_change_action(); +static short no_change_action(); +static short lpt1_change_action(); +static short lpt2_change_action(); +#if (NUM_PARALLEL_PORTS>2) +static short lpt3_change_action(); +#endif +static short com1_change_action(); +static short com2_change_action(); +boolean pc_initiated=FALSE; +char *pc_uif_text; + +boolean use_comments = TRUE; /* Set to true if commenting required. */ + +#define defaults_filename "SoftPC.rez" + +static char *ends[] = +{ + "st","nd","rd","th" +}; + +/* Table definitions for options that take one of n 'value' strings. + * The table is used to look up the string and find what it means + * to the host in this option. + * Look at the tables for more explanation, they're fairly self-explanatory. + */ +name_table bool_values[] = +{ + { "yes", TRUE }, + { "Yes", TRUE }, + { "YES", TRUE }, + { "no", FALSE }, + { "No", FALSE }, + { "NO", FALSE }, + { NULL, 0 } +}; + +name_table gfx_adapter_types[] = +{ + { "HERCULES", HERCULES }, + { "CGA", CGA }, + { "EGA", EGA }, + { "VGA", VGA }, + { NULL, 0 } +}; + +/* The BIG one! This is a decription of each option that the config struct + * must have, and its requirements. Used by config for all sorts of things. + * For a fuller explanation look in the document: + * 'Design Proposal for the New Config System'. + */ + +option_description narrative[] = +{ + { /* FOR EACH OPTION... */ + "HARD_DISK_FILENAME", /* Name */ + C_HARD_DISK1_NAME, /* Host name for option */ + C_STRING_RECORD, /* Option (base) primitive type */ + C_HARD_DISKS, /* Host option commonality type */ + FALSE, /* Option is READ_ONLY if TRUE */ + null_table, /* Pointer to table (null if not needed) */ + TRUE, /* TRUE if default present, FALSE if not */ + "/usr/lib/SoftPC/hard_disk", /* Default value as a string as if in resource file */ + TRUE, /* TRUE if changing the option requires SoftPC reset */ + TRUE, /* TRUE if option may be setup via the UIF */ + DISK_CONFIG, /* Panel 'type' if you have different panels */ + validate_c_drive, /* validation function */ + c_drive_change_action /* function to do changing actions */ + }, + { + "HARD_DISK_FILENAME2", + C_HARD_DISK2_NAME, + C_STRING_RECORD, + C_HARD_DISKS, + FALSE, + null_table, + TRUE, + "", + TRUE, + TRUE, + DISK_CONFIG, + validate_d_drive, + d_drive_change_action + }, + { + "COM_PORT_1", + C_COM1_NAME, + C_STRING_RECORD, + C_SINGULARITY, + FALSE, + null_table, + TRUE, + "", + FALSE, + FALSE, + COMMS_CONFIG, + validate_com1, + com1_change_action + }, + { + "COM_PORT_2", + C_COM2_NAME, + C_STRING_RECORD, + C_SINGULARITY, + FALSE, + null_table, + TRUE, + "", + FALSE, + FALSE, + COMMS_CONFIG, + validate_com2, + com2_change_action + }, + { + "LPT_PORT_1", + C_LPT1_NAME, + C_STRING_RECORD, + C_SINGULARITY, + FALSE, + null_table, + TRUE, + "", + FALSE, + FALSE, + COMMS_CONFIG, + validate_lpt1, + lpt1_change_action + }, + { + "LPT_PORT_2", + C_LPT2_NAME, + C_STRING_RECORD, + C_SINGULARITY, + FALSE, + null_table, + TRUE, + "", + FALSE, + FALSE, + COMMS_CONFIG, + validate_lpt2, + lpt2_change_action + }, + { + "GRAPHICS_ADAPTOR", + C_GFX_ADAPTER, + C_NAME_RECORD, + C_SINGULARITY, + FALSE, + gfx_adapter_types, + TRUE, + "VGA", + TRUE, + TRUE, + DISPLAY_CONFIG, + validate_item, + no_change_action + }, + { + NULL, + 0, + 0, + C_SINGULARITY, + FALSE, + null_table, + FALSE, + NULL, + FALSE, + FALSE, + NON_CONFIG, + no_validation, + no_change_action + } +}; + +/* Runtime variables */ + +struct +{ + boolean mouse_attached; + boolean config_verbose; + boolean npx_enabled; + boolean sound_on; + boolean com_flow_control[2]; + int floppy_state[2]; + int floppy_active_state[2]; + int floppy_capacity[2]; + int hd_cyls[2]; + boolean lptflush1; + boolean lptflush2; + boolean lptflush3; + int flushtime1; + int flushtime2; + int flushtime3; +} runtime_status; + +#define NUM_OPTS ( sizeof(narrative) / sizeof( option_description) ) + +/*********** Imported and exported items *************/ + +extern char *getenv(); +extern char *malloc(); + +/*************** Local Declarations *****************/ + +void host_config_error(); +static char buff[MAXPATHLEN]; +static char buff1[MAXPATHLEN]; +boolean item_in_table(); +static char home_resource[MAXPATHLEN]; +static char sys_resource[MAXPATHLEN]; + +/*********************************************************/ + +short host_runtime_inquire(what) +int what; + +{ + switch(what) + { + case C_MOUSE_ATTACHED: + return( runtime_status.mouse_attached ); + break; + + case C_CONFIG_VERBOSE: + return( runtime_status.config_verbose ); + break; + + case C_NPX_ENABLED: + return( runtime_status.npx_enabled ); + break; + + case C_HD1_CYLS: + return( runtime_status.hd_cyls[0] ); + break; + + case C_HD2_CYLS: + return( runtime_status.hd_cyls[1] ); + break; + + case C_FLOPPY1_STATE: + return( runtime_status.floppy_state[0] ); + break; + + case C_FLOPPY2_STATE: + return( runtime_status.floppy_state[1] ); + break; + + case C_FLOPPY1_ACTIVE_STATE: + return( runtime_status.floppy_active_state[0] ); + break; + + case C_FLOPPY2_ACTIVE_STATE: + return( runtime_status.floppy_active_state[1] ); + break; + + case C_FLOPPY1_CAPACITY: + return( runtime_status.floppy_capacity[0] ); + break; + + case C_FLOPPY_TYPE_CHANGED: + return( runtime_status.floppy_type_changed ); + break; + + case C_FLOPPY2_CAPACITY: + return( runtime_status.floppy_capacity[1] ); + break; + + case C_SOUND_ON: + return( runtime_status.sound_on ); + break; + + case C_REAL_FLOPPY_ALLOC: + return( runtime_status.floppy_state[0] == GFI_REAL_DISKETTE_SERVER || + runtime_status.floppy_state[1] == GFI_REAL_DISKETTE_SERVER ); + break; + + case C_REAL_OR_SLAVE: + return( runtime_status.floppy_A_real ); + break; + + case C_SLAVE_FLOPPY_ALLOC: + return( runtime_status.floppy_state[0] == GFI_SLAVE_SERVER ); + break; + + case C_COM1_FLOW: + return( runtime_status.com_flow_control[0] ); + break; + + case C_COM2_FLOW: + return( runtime_status.com_flow_control[1] ); + break; + + case C_COM3_FLOW: + return( FALSE ); + break; + + case C_COM4_FLOW: + return( FALSE ); + break; + + case C_LPTFLUSH1: + return( runtime_status.lptflush1 ); + break; + + case C_LPTFLUSH2: + return( runtime_status.lptflush2 ); + break; + + case C_LPTFLUSH3: + return( runtime_status.lptflush3 ); + break; + + case C_FLUSHTIME1: + return( runtime_status.flushtime1 ); + break; + + case C_FLUSHTIME2: + return( runtime_status.flushtime2 ); + break; + + case C_FLUSHTIME3: + return( runtime_status.flushtime3 ); + break; + + default: + host_error(EG_OWNUP, ERR_QUIT, "host_runtime_inquire"); + } +} + +void host_runtime_set(what,value) +int what; +int value; +{ + switch(what) + { + case C_MOUSE_ATTACHED: + runtime_status.mouse_attached = value; + break; + + case C_CONFIG_VERBOSE: + runtime_status.config_verbose = value; + break; + + case C_NPX_ENABLED: + runtime_status.npx_enabled = value; + break; + + case C_HD1_CYLS: + runtime_status.hd_cyls[0] = value; + break; + + case C_HD2_CYLS: + runtime_status.hd_cyls[1] = value; + break; + + case C_FLOPPY1_STATE: + runtime_status.floppy_state[0] = value; + break; + + case C_FLOPPY2_STATE: + runtime_status.floppy_state[1] = value; + break; + + case C_FLOPPY1_ACTIVE_STATE: + runtime_status.floppy_active_state[0] = value; + break; + + case C_FLOPPY2_ACTIVE_STATE: + runtime_status.floppy_active_state[1] = value; + break; + + case C_FLOPPY1_CAPACITY: + runtime_status.floppy_capacity[0] = value; + break; + + case C_FLOPPY2_CAPACITY: + runtime_status.floppy_capacity[1] = value; + break; + + case C_FLOPPY_TYPE_CHANGED: + runtime_status.floppy_type_changed = value; + break; + + case C_SOUND_ON: + runtime_status.sound_on = value; + break; + + case C_REAL_OR_SLAVE: + runtime_status.floppy_A_real = value; + break; + + case C_COM1_FLOW: + runtime_status.com_flow_control[0] = value; + break; + + case C_COM2_FLOW: + runtime_status.com_flow_control[1] = value; + break; + + case C_COM3_FLOW: + case C_COM4_FLOW: + break; + + case C_LPTFLUSH1: + runtime_status.lptflush1 =value; + break; + + case C_LPTFLUSH2: + runtime_status.lptflush2 =value; + break; + + case C_LPTFLUSH3: + runtime_status.lptflush3 =value; + break; + + case C_FLUSHTIME1: + runtime_status.flushtime1 =value; + break; + + case C_FLUSHTIME2: + runtime_status.flushtime2 =value; + break; + + case C_FLUSHTIME3: + runtime_status.flushtime3 =value; + break; + + default: + host_error(EG_OWNUP, ERR_QUIT, "host_runtime_set"); + } +} + +void host_runtime_init() +{ + config_values var; + +#ifdef NPX + host_runtime_set(C_NPX_ENABLED,TRUE); +#else + host_runtime_set(C_NPX_ENABLED,FALSE); +#endif + +#ifndef PROD + printf("NPX is %s\n",host_runtime_inquire(C_NPX_ENABLED)? "on.":"off."); +#endif + host_runtime_set(C_FLUSHTIME1, 5); + host_runtime_set(C_FLUSHTIME2, 10); + host_runtime_set(C_FLUSHTIME3, 15); + host_runtime_set(C_MOUSE_ATTACHED,FALSE); + host_runtime_set(C_CONFIG_VERBOSE,TRUE); + host_runtime_set(C_SOUND_ON,FALSE); + host_runtime_set(C_FLOPPY1_STATE,GFI_EMPTY_SERVER); + host_runtime_set(C_FLOPPY2_STATE,GFI_EMPTY_SERVER); + host_runtime_set(C_FLOPPY1_ACTIVE_STATE,GFI_EMPTY_SERVER); + host_runtime_set(C_FLOPPY2_ACTIVE_STATE,GFI_EMPTY_SERVER); + host_runtime_set(C_REAL_OR_SLAVE,FALSE); + host_runtime_set(C_FLOPPY_TYPE_CHANGED,FALSE); +} + +/* + * General host initialisation function. It is called only once on startup + * from 'config()'. It does the following (at the moment): + * + * 1) Makes the 'option' field of the 'config_info' struct pointed to by 'head' * point to all the option 'rules' - that is the 'narrative' structure + * initialised at the start of this file. + * + * 2) Counts up the option rules in 'narrative' and stores the result in the + * 'config_info' struct. + * + * 3) Return the minimum padding length necessary. + * + * 4) Derive the two path:filenames for the resource file. This file may be + * in the user's $HOME directory or in softpc's ROOT directory. Making up + * these strings now saves doing it every time 'config_store()' is called. + */ + +void host_get_config_info(head) +config_description *head; +{ + + char *pp, *getenv(); + option_description *option_p = narrative; + + head->option = narrative; /* Attach 'narrative' */ + head->option_count = NUM_OPTS - 1; + head->min_pad_len = MIN_OPTION_ARG_DIST; + + /* + * get system resource file from standard place + */ + strcpy(sys_resource, ROOT); + + strcat(sys_resource, PATH_SEPARATOR); + strcat(sys_resource, RESOURCE_FILENAME); +} + +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ +/*::::::::::::::::::::::: Try and load database files ::::::::::::::::::::::*/ +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + +static boolean try_load_database() +{ + FILE *infile = NULL; + char in_line[MAXPATHLEN]; + char *cp; + char *home, *getenv(); + + /* Keep this the same as system for the moment */ + + sprintf(home_resource,"%s%s%s",ROOT,PATH_SEPARATOR,RESOURCE_FILENAME); + + /*....................................... Attempt to open resource file */ + + if((infile = fopen(home_resource, "r")) == NULL) + return(FALSE); + + /*.................................................. Read resource file */ + + while (fgets(in_line, MAXPATHLEN, infile) != NULL) + { + /*........................................ strip control characters */ + + for(cp = in_line; *cp ; cp++) if(*cp < ' ') *cp = ' '; + + add_resource_node(in_line); + } + + /*............................. Close resource file and get out of here */ + + fclose(infile); + return TRUE; +} + +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ +/*:::::::::::::::::::::: Try to load system files ::::::::::::::::::::::::::*/ +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + +static boolean try_load_sys_file() +{ + FILE *infile = NULL; + char in_line[MAXPATHLEN]; + register char *cp; + + /*................................ Attempt to open system resource file */ + + if((infile = fopen(sys_resource, "r")) == NULL) + return(FALSE); + + /*................................................. read resource file */ + + while (fgets(in_line, MAXPATHLEN, infile) != NULL) + { + /*......................................... strip control characters */ + + for(cp = in_line; *cp ; cp++) + if(*cp < ' ') *cp = ' '; + + add_resource_node(in_line); + } + + /*........................................ close resource file and exit */ + + fclose(infile); + return(TRUE); +} + +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ +/*:::::::::::::::::::::::::: Read resource file ::::::::::::::::::::::::::::*/ +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + +short host_read_resource_file(resource_data *resource) +{ + boolean bad_home=FALSE, bad_sys=FALSE; + + /* Try open users default database failing that, open the system file. */ + + if(bad_home = !try_load_database()) + bad_sys = !try_load_sys_file(); + + if(bad_home && bad_sys) return(EG_ALL_RESOURCE_BAD_R); + + return(bad_home ? EG_BAD_LOCAL_RESOURCE_R : C_CONFIG_OP_OK); +} + +short host_write_resource_file(resource) +resource_data *resource; +{ + +FILE *outfile; +line_node *node; +boolean bad_home=TRUE, bad_sys=FALSE; + + /* Try to open (for writing) a resource file in the users home directory or + failing that, the system one. These two paths are set up once at runtime. */ + + if(home_resource[0] != '\0') + if((outfile = fopen(home_resource, "w")) != NULL) + bad_home = FALSE; + + if(bad_home) + if((outfile = fopen(sys_resource, "w")) == NULL) + bad_sys = TRUE; + + if(bad_home && !bad_sys) + return EG_ALL_RESOURCE_BAD_W; + + else + if(bad_home && bad_sys) + return EG_ALL_RESOURCE_BAD_W; + + node = resource->first; + while(node != NULL) + { + fputs(node->line,outfile); + fputc('\n',outfile); + node = node->next; + } + fclose(outfile); + return(C_CONFIG_OP_OK); + +} + + +/* A host specific extension to config_inquire() to deal with any inquiries + that the base config code doesn't or shouldn't know about. */ + + +void host_inquire_extn(sort,identity,values) +short sort; +int identity; +config_values *values; +{ +} + +static char error_text[300]; +static int error_locus; + +host_error_query_locus(locus,text) +int *locus; +char **text; +{ + *locus = error_locus; + *text = error_text; +} + +host_error_set_locus(text, locus) +char *text; +int locus; +{ + strcpy(error_text, text); + error_locus = locus; +} + +static short no_validation(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ + return(C_CONFIG_OP_OK); +} + +static short validate_c_drive(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation for moment as this will disapear */ + return(C_CONFIG_OP_OK); +} + +static short validate_d_drive(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation for moment as this will disapear */ + return(C_CONFIG_OP_OK); +} + +static short validate_com1(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short validate_com2(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short validate_lpt1(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short validate_lpt2(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short validate_item(value, table, buf) +config_values *value; +name_table table[]; +char *buf; +{ +/* cheat on validation - no table lookup */ + return(C_CONFIG_OP_OK); +} + +boolean item_in_table(val,table) +int val; +name_table table[]; +{ + int n=0; + while(table[n].string != NULL) + if(table[n].value == val) + break; + else + n++; + return( table[n].string == NULL? FALSE : TRUE); +} + +static short no_change_action( value, buf) +config_values *value; +char *buf; +{ + return( C_CONFIG_OP_OK ); +} + +static short c_drive_change_action( value, buf) +config_values *value; +char *buf; +{ + short err; + + fdisk_iodetach (); + fdisk_physdetach(0); + + if (err = fdisk_physattach( 0, value->string)) + strcpy(buf, narrative[C_HARD_DISK1_NAME].option_name); + + fdisk_ioattach (); + + return (err); + +} + +static short d_drive_change_action( value, buf) +config_values *value; +char *buf; +{ + short err; + + fdisk_iodetach (); + fdisk_physdetach(1); + + if (err = fdisk_physattach( 1, value->string)) + strcpy(buf, narrative[C_HARD_DISK2_NAME].option_name); + + fdisk_ioattach (); + + return (err); +} + +static short lpt1_change_action( value, buf) +config_values *value; +char *buf; +{ +#ifdef STUBBED + host_lpt_close(0); + return (host_lpt_open(0, value->string, buf)); +#endif /*STUBBED*/ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short lpt2_change_action( value, buf) +config_values *value; +char *buf; +{ +#ifdef STUBBED + host_lpt_close(1); + return (host_lpt_open(1, value->string, buf)); +#endif /*STUBBED*/ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short com1_change_action( value, buf) +config_values *value; +char *buf; +{ +#ifdef STUBBED + host_com_close(0); + return (host_com_open(0, value->string, buf)); +#endif /*STUBBED*/ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +static short com2_change_action( value, buf) +config_values *value; +char *buf; +{ +#ifdef STUBBED + host_com_close(1); + return (host_com_open(1, value->string, buf)); +#endif /*STUBBED*/ +/* cheat on validation for moment as this will change */ + return(C_CONFIG_OP_OK); +} + +/*********** Floppy and hard disk init ****************/ + +void host_floppy_startup(driveno) +int driveno; +{ + host_floppy_init(driveno, GFI_EMPTY_SERVER ); +} + +void host_hd_startup() +{ + int error; + config_values disk1_name,disk2_name; + + /* Start by getting the C: drive up */ + + fdisk_physdetach(0); + config_inquire(C_INQUIRE_VALUE,C_HARD_DISK1_NAME,&disk1_name); + error = fdisk_physattach(0,disk1_name.string); + if(error) + { + host_error(error, ERR_CONFIG|ERR_QUIT, disk1_name.string); + } + +/* If that went ok, try for D: */ + + config_inquire(C_INQUIRE_VALUE,C_HARD_DISK2_NAME,&disk2_name); + if(!strcmp(disk2_name.string,"")) + return; /* No D: drive! */ + + if(!strcmp(disk2_name.string,disk1_name.string)) + host_error(EG_SAME_HD_FILE, ERR_CONFIG|ERR_QUIT, disk2_name.string); + + error = fdisk_physattach(1,disk2_name.string); + if(error) + host_error(error, ERR_CONFIG|ERR_QUIT, disk2_name.string); + +} + +/* temp hack */ +char *host_get_spc_home() { return("c:\\softpc"); } |