Added fdkrncfg.c, the kernel configuration part of sys
git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@318 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
6b297246a3
commit
e092c873fa
335
sys/fdkrncfg.c
Normal file
335
sys/fdkrncfg.c
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* *
|
||||||
|
* FDKRNCFG.C - FreeDOS Kernel Configuration *
|
||||||
|
* This is a simple little program that merely displays and/or changes *
|
||||||
|
* the configuration options specified within the CONFIG section of *
|
||||||
|
* the FreeDOS Kernel (if supported) *
|
||||||
|
* *
|
||||||
|
* Initially Written by Kenneth J. Davis Oct 11, 2001 (public domain) *
|
||||||
|
* Future versions may contain copyrighted portions, if so the *
|
||||||
|
* copyright holders should be listed after this line. *
|
||||||
|
* Initial release - public domain *
|
||||||
|
* *
|
||||||
|
* merged into SYS by tom ehlert *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* This source compiled & tested with Borland C/C++ 3.1 + TC 2.01*/
|
||||||
|
|
||||||
|
|
||||||
|
char VERSION[] = "v1.00";
|
||||||
|
char PROGRAM[] = "SYS CONFIG";
|
||||||
|
char KERNEL[] = "KERNEL.SYS";
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#define FAR far
|
||||||
|
#include "kconfig.h"
|
||||||
|
|
||||||
|
KernelConfig cfg = {0};
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned char byte;
|
||||||
|
typedef unsigned short word;
|
||||||
|
typedef unsigned long dword;
|
||||||
|
|
||||||
|
|
||||||
|
/* These structures need to be byte packed, if your compiler
|
||||||
|
does not do this by default, add the appropriate command,
|
||||||
|
such as #pragma pack(1) here, protected with #ifdefs of course.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Displays command line syntax */
|
||||||
|
void showUsage(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
printf("FreeDOS Kernel Configuration %s\n", VERSION);
|
||||||
|
printf("Usage: \n"
|
||||||
|
" %s \n"
|
||||||
|
" %s [/help | /?]\n"
|
||||||
|
" %s [ [drive:][path]%s] [option=value ...] \n",
|
||||||
|
PROGRAM, PROGRAM, PROGRAM, KERNEL);
|
||||||
|
printf("\n");
|
||||||
|
printf(" If no options are given, the current values are shown.\n");
|
||||||
|
printf(" %/help or ? displays this usage information.\n"
|
||||||
|
" [drive:][path]KERNEL.SYS specifies the kernel file to\n"
|
||||||
|
" modify, if not given defaults to \\%s\n",
|
||||||
|
KERNEL);
|
||||||
|
printf("\n");
|
||||||
|
printf(" option=value ... specifies one or more options and the values\n"
|
||||||
|
" to set each to. If an option is given multiple times,\n"
|
||||||
|
" the value set will be the rightmost one.\n");
|
||||||
|
printf(" Current Options are: DLASORT=0|1, SHOWDRIVEASSIGNMENT=0|1\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* simply reads in current configuration values, exiting program
|
||||||
|
with an error message and error code unable to, otherwise
|
||||||
|
cfg & kfile are valid on return.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Reads in the current kernel configuration settings,
|
||||||
|
return 0 on success, nonzero on error. If there was
|
||||||
|
an actual error the return value is positive, if there
|
||||||
|
were no errors, but the CONFIG section was not found
|
||||||
|
then a negative value is returned. cfg is only altered
|
||||||
|
if the return value is 0 (ie successfully found and
|
||||||
|
read in the config section). The position of the file
|
||||||
|
pointer on input does not matter, the file position
|
||||||
|
upon return may be anywhere. The memory allocated for
|
||||||
|
cfg should be freed to prevent memory leakage (it should
|
||||||
|
not point to allocated memory on entry, as that memory
|
||||||
|
will not be used, and will likely not be freed as a result).
|
||||||
|
*/
|
||||||
|
int readConfigSettings(int kfile, char *kfilename, KernelConfig *cfg)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
int configBlkFound;
|
||||||
|
word cfgSize;
|
||||||
|
|
||||||
|
|
||||||
|
/* Seek to start of kernel file */
|
||||||
|
if (lseek(kfile, 2, SEEK_SET) != 2)
|
||||||
|
printf("can't seek to offset 2\n"),exit(1);
|
||||||
|
|
||||||
|
if (read(kfile,cfg,sizeof(KernelConfig)) != sizeof(KernelConfig))
|
||||||
|
printf("can't read %u bytes\n",sizeof(KernelConfig)),exit(1);
|
||||||
|
|
||||||
|
if (memcmp(cfg->CONFIG, "CONFIG", 6) != 0)
|
||||||
|
{
|
||||||
|
printf("Error: no CONFIG section found in kernel file <%s>\n", kfilename);
|
||||||
|
printf("Only FreeDOS kernels after 2025 contain a CONFIG section!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Writes config values out to file.
|
||||||
|
Returns 0 on success, nonzero on error.
|
||||||
|
*/
|
||||||
|
int writeConfigSettings(int kfile, KernelConfig *cfg)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Seek to CONFIG section at start of options of kernel file */
|
||||||
|
if (lseek(kfile, 2, SEEK_SET) != 2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Write just the config option information out */
|
||||||
|
if (write(kfile, cfg, sizeof(KernelConfig)) != sizeof(KernelConfig))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* successfully wrote out kernel config data */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Displays kernel configuration information */
|
||||||
|
void displayConfigSettings(KernelConfig *cfg)
|
||||||
|
{
|
||||||
|
/* print known options and current value - only if available */
|
||||||
|
|
||||||
|
if (cfg->ConfigSize >= 1)
|
||||||
|
{
|
||||||
|
printf("DLASORT=0x%02X Sort disks by drive order: *0=no, 1=yes\n",
|
||||||
|
cfg->DLASortByDriveNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->ConfigSize >= 2)
|
||||||
|
{
|
||||||
|
printf("SHOWDRIVEASSIGNMENT=0x%02X Show how drives assigned: *1=yes 0=no\n",
|
||||||
|
cfg->InitDiskShowDriveAssignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->ConfigSize >= 3)
|
||||||
|
{
|
||||||
|
printf("SKIPCONFIGSECONDS=%-2d time to wait for F5/F8 : *2 sec\n",
|
||||||
|
cfg->SkipConfigSeconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 /* we assume that SYS is as current as the kernel */
|
||||||
|
|
||||||
|
/* Print value any options added that are unknown as hex dump */
|
||||||
|
if (cfg->configHdr.configSize > sizeof(ConfigData))
|
||||||
|
{
|
||||||
|
printf("Additional options are available, they are not currently\n"
|
||||||
|
"supported by this tool. The current extra values are (in Hex):\n");
|
||||||
|
for (i = 0; i < (cfg->configSize-sizeof(ConfigData)); i++)
|
||||||
|
{
|
||||||
|
if ((i%32) == 0) printf("\n");
|
||||||
|
else if ((i%4) == 0) printf(" ");
|
||||||
|
printf("%02X", (unsigned int)cfg->extra[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Sets the given location to a byte value if different,
|
||||||
|
displays warning if values exceeds max
|
||||||
|
*/
|
||||||
|
void setByteOption(byte *option, char *value, word max, int *updated, char *name)
|
||||||
|
{
|
||||||
|
int optionValue;
|
||||||
|
|
||||||
|
optionValue = atoi(value);
|
||||||
|
if (optionValue > max)
|
||||||
|
{
|
||||||
|
printf("Warning: Option %s: Value <0x%02X> may be invalid!\n",
|
||||||
|
name, (unsigned int)((byte)optionValue));
|
||||||
|
}
|
||||||
|
/* Don't bother updating if same value */
|
||||||
|
if ((byte)optionValue != *option)
|
||||||
|
{
|
||||||
|
*option = (byte)optionValue;
|
||||||
|
*updated = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Main, processes command line options and calls above
|
||||||
|
functions as required.
|
||||||
|
*/
|
||||||
|
int FDKrnConfigMain(int argc,char **argv)
|
||||||
|
{
|
||||||
|
char *kfilename = KERNEL;
|
||||||
|
int kfile;
|
||||||
|
int updates = 0; /* flag used to indicate if we need to update kernel */
|
||||||
|
int argstart,i;
|
||||||
|
char *cptr;
|
||||||
|
char *argptr;
|
||||||
|
|
||||||
|
printf("FreeDOS System configurator %s \n", VERSION);
|
||||||
|
|
||||||
|
|
||||||
|
/* 1st go through and just process arguments (help/filename/etc) */
|
||||||
|
for (i = 2; i < argc; i++)
|
||||||
|
{
|
||||||
|
argptr = argv[i];
|
||||||
|
|
||||||
|
/* is it an argument or an option specifier */
|
||||||
|
if (argptr[0] == '-' || argptr[0] == '/')
|
||||||
|
{
|
||||||
|
switch(argptr[1])
|
||||||
|
{
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
showUsage();
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("Invalid argument found <%s>.\nUse %s /help for usage.\n",
|
||||||
|
argptr, PROGRAM);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argstart = 2;
|
||||||
|
|
||||||
|
argptr = argv[argstart];
|
||||||
|
|
||||||
|
cptr = strchr(argptr, '=');
|
||||||
|
|
||||||
|
if (argptr == 0)
|
||||||
|
{
|
||||||
|
showUsage();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* the first argument may be the kernel name */
|
||||||
|
if (strchr(argptr, '=') == NULL)
|
||||||
|
{
|
||||||
|
kfilename = argptr;
|
||||||
|
argstart++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
kfile = open(kfilename, O_RDWR | O_BINARY);
|
||||||
|
|
||||||
|
if (kfile < 0)
|
||||||
|
printf("Error: unable to open kernel file <%s>\n", kfilename),exit(1);
|
||||||
|
|
||||||
|
|
||||||
|
/* now that we know the filename (default or given) get config info */
|
||||||
|
readConfigSettings(kfile, kfilename, &cfg);
|
||||||
|
|
||||||
|
for (i = argstart; i < argc; i++)
|
||||||
|
{
|
||||||
|
argptr = argv[i];
|
||||||
|
|
||||||
|
if ((cptr = strchr(argptr,'=')) == NULL)
|
||||||
|
goto illegal_arg;
|
||||||
|
|
||||||
|
/* split argptr into 2 pieces and make cptr point to 2nd one */
|
||||||
|
*cptr = '\0';
|
||||||
|
cptr++;
|
||||||
|
|
||||||
|
/* allow 3 valid characters */
|
||||||
|
if (memicmp(argptr, "DLASORT",3) == 0)
|
||||||
|
{
|
||||||
|
setByteOption(&(cfg.DLASortByDriveNo),
|
||||||
|
cptr, 1, &updates, "DLASORT");
|
||||||
|
}
|
||||||
|
else if (memicmp(argptr, "SHOWDRIVEASSIGNMENT",3) == 0)
|
||||||
|
{
|
||||||
|
setByteOption(&(cfg.InitDiskShowDriveAssignment),
|
||||||
|
cptr, 1, &updates, "SHOWDRIVEASSIGNMENT");
|
||||||
|
}
|
||||||
|
else if (memicmp(argptr, "SKIPCONFIGSECONDS",3) == 0)
|
||||||
|
{
|
||||||
|
setByteOption(&(cfg.SkipConfigSeconds),
|
||||||
|
cptr, 1, &updates, "SKIPCONFIGSECONDS");
|
||||||
|
updates++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
illegal_arg:
|
||||||
|
printf("Unknown option found <%s>.\nUse %s /help for usage.\n",
|
||||||
|
argptr, PROGRAM);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write out new config values if modified */
|
||||||
|
if (updates)
|
||||||
|
{
|
||||||
|
/* update it */
|
||||||
|
if (writeConfigSettings(kfile, &cfg))
|
||||||
|
{
|
||||||
|
printf("Error: Unable to write configuration changes to kernel!\n");
|
||||||
|
printf(" <%s>\n", kfilename);
|
||||||
|
close(kfile);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* display new settings */
|
||||||
|
printf("\nUpdated Kernel settings.\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("Current Kernel settings.\n");
|
||||||
|
|
||||||
|
|
||||||
|
/* display current settings */
|
||||||
|
displayConfigSettings(&cfg);
|
||||||
|
|
||||||
|
/* and done */
|
||||||
|
close(kfile);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user