ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /os/boot/puma/conf.c/
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"
#include "dosfs.h"
static char *confname[MAXCONF];
static char *confval[MAXCONF];
static int nconf;
static char* defplan9ini =
"ether0=type=CS8900\r\n"
"vgasize=640x480x8\r\n"
"kernelpercent=40\r\n"
"console=1\r\nbaud=9600\r\n"
;
extern char **ini;
char*
getconf(char *name)
{
int i;
for(i = 0; i < nconf; i++)
if(strcmp(confname[i], name) == 0)
return confval[i];
return 0;
}
/*
* read configuration file
*/
int
plan9ini(Dos *dos, char *val)
{
Dosfile rc;
int i, n;
char *cp, *p, *q, *line[MAXCONF];
cp = BOOTARGS;
if(dos) {
if(dosstat(dos, *ini, &rc) <= 0)
return -1;
*cp = 0;
n = dosread(&rc, cp, BOOTARGSLEN-1);
if(n <= 0)
return -1;
cp[n] = 0;
} else if(val != nil){
if(memchr(val, 0, BOOTARGSLEN-1) == nil)
return -1;
print("Using flash configuration\n");
strcpy(cp, val);
n = strlen(cp);
}else{
print("Using default configuration\n");
strcpy(cp, defplan9ini);
n = strlen(cp);
}
/*
* Make a working copy.
* We could change this to pass the parsed strings
* to the booted programme instead of the raw
* string, then it only gets done once.
*/
memmove(cp+BOOTARGSLEN, cp, n+1);
cp += BOOTARGSLEN;
/*
* Strip out '\r', change '\t' -> ' '.
*/
p = cp;
for(q = cp; *q; q++){
if(*q == '\r')
continue;
if(*q == '\t')
*q = ' ';
*p++ = *q;
}
*p = 0;
n = getcfields(cp, line, MAXCONF, "\n");
for(i = 0; i < n; i++){
cp = strchr(line[i], '=');
if(cp == 0)
continue;
*cp++ = 0;
if(cp - line[i] >= NAMELEN+1)
*(line[i]+NAMELEN-1) = 0;
confname[nconf] = line[i];
confval[nconf] = cp;
nconf++;
}
return 0;
}
static int
parseether(uchar *to, char *from)
{
char nip[4];
char *p;
int i;
p = from;
while(*p == ' ')
++p;
for(i = 0; i < 6; i++){
if(*p == 0)
return -1;
nip[0] = *p++;
if(*p == 0)
return -1;
nip[1] = *p++;
nip[2] = 0;
to[i] = strtoul(nip, 0, 16);
if(*p == ':')
p++;
}
return 0;
}
int
isaconfig(char *class, int ctlrno, ISAConf *isa)
{
char cc[NAMELEN], *p, *q, *r;
int n;
sprint(cc, "%s%d", class, ctlrno);
for(n = 0; n < nconf; n++){
if(strncmp(confname[n], cc, NAMELEN))
continue;
isa->nopt = 0;
p = confval[n];
while(*p){
while(*p == ' ' || *p == '\t')
p++;
if(*p == '\0')
break;
if(strncmp(p, "type=", 5) == 0){
p += 5;
for(q = isa->type; q < &isa->type[NAMELEN-1]; q++){
if(*p == '\0' || *p == ' ' || *p == '\t')
break;
*q = *p++;
}
*q = '\0';
}
else if(strncmp(p, "port=", 5) == 0)
isa->port = strtoul(p+5, &p, 0);
else if(strncmp(p, "irq=", 4) == 0)
isa->irq = strtoul(p+4, &p, 0);
else if(strncmp(p, "mem=", 4) == 0)
isa->mem = strtoul(p+4, &p, 0);
else if(strncmp(p, "size=", 5) == 0)
isa->size = strtoul(p+5, &p, 0);
else if(strncmp(p, "ea=", 3) == 0){
if(parseether(isa->ea, p+3) == -1)
memset(isa->ea, 0, 6);
}
else if(isa->nopt < NISAOPT){
r = isa->opt[isa->nopt];
while(*p && *p != ' ' && *p != '\t'){
*r++ = *p++;
if(r-isa->opt[isa->nopt] >= ISAOPTLEN-1)
break;
}
*r = '\0';
isa->nopt++;
}
while(*p && *p != ' ' && *p != '\t')
p++;
}
return 1;
}
return 0;
}