#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 */ int plan9ini(Dos *dos) { Dosfile rc; int i, n; char *cp, *line[MAXCONF]; if(dosstat(dos, *ini, &rc) <= 0) return -1; cp = BOOTARGS; *cp = 0; n = dosread(&rc, cp, BOOTARGSLEN-1); if(n <= 0) return -1; cp[n] = 0; /* * 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); n = getfields(cp+BOOTARGSLEN, line, MAXCONF, '\n'); for(i = 0; i < n; i++){ cp = strchr(line[i], '\r'); if(cp) *cp = 0; 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; int n; sprint(cc, "%s%d", class, ctlrno); for(n = 0; n < nconf; n++){ if(strncmp(confname[n], cc, NAMELEN)) continue; 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); } while(*p && *p != ' ' && *p != '\t') p++; } return 1; } return 0; }