Charles.Forsyth20060303644188019 years agoHistory
173 lines · 3.0 KB · C
RawDownload
#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; 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 */intplan9ini(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{		strcpy(cp, archconfig());		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;} intparseether(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;} intisaconfig(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;}