1 #include "u.h"
2 #include "lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "io.h"
7
8 #include "dosfs.h"
9
10 static char *confname[MAXCONF];
11 static char *confval[MAXCONF];
12 static int nconf;
13
14 extern char **ini;
15
16 char*
getconf(char * name)17 getconf(char *name)
18 {
19 int i;
20
21 for(i = 0; i < nconf; i++)
22 if(strcmp(confname[i], name) == 0)
23 return confval[i];
24 return 0;
25 }
26
27 /*
28 * read configuration file
29 */
30 int
plan9ini(Dos * dos,char * val)31 plan9ini(Dos *dos, char *val)
32 {
33 Dosfile rc;
34 int i, n;
35 char *cp, *p, *q, *line[MAXCONF];
36
37 cp = BOOTARGS;
38 if(dos) {
39 if(dosstat(dos, *ini, &rc) <= 0)
40 return -1;
41
42 *cp = 0;
43 n = dosread(&rc, cp, BOOTARGSLEN-1);
44 if(n <= 0)
45 return -1;
46 cp[n] = 0;
47 } else if(val != nil){
48 if(memchr(val, 0, BOOTARGSLEN-1) == nil)
49 return -1;
50 print("Using flash configuration\n");
51 strcpy(cp, val);
52 n = strlen(cp);
53 }else{
54 strcpy(cp, archconfig());
55 n = strlen(cp);
56 }
57
58 /*
59 * Make a working copy.
60 * We could change this to pass the parsed strings
61 * to the booted programme instead of the raw
62 * string, then it only gets done once.
63 */
64 memmove(cp+BOOTARGSLEN, cp, n+1);
65 cp += BOOTARGSLEN;
66
67 /*
68 * Strip out '\r', change '\t' -> ' '.
69 */
70 p = cp;
71 for(q = cp; *q; q++){
72 if(*q == '\r')
73 continue;
74 if(*q == '\t')
75 *q = ' ';
76 *p++ = *q;
77 }
78 *p = 0;
79 n = getcfields(cp, line, MAXCONF, "\n");
80 for(i = 0; i < n; i++){
81 cp = strchr(line[i], '=');
82 if(cp == 0)
83 continue;
84 *cp++ = 0;
85 if(cp - line[i] >= NAMELEN+1)
86 *(line[i]+NAMELEN-1) = 0;
87 confname[nconf] = line[i];
88 confval[nconf] = cp;
89 nconf++;
90 }
91 return 0;
92 }
93
94 int
parseether(uchar * to,char * from)95 parseether(uchar *to, char *from)
96 {
97 char nip[4];
98 char *p;
99 int i;
100
101 p = from;
102 while(*p == ' ')
103 ++p;
104 for(i = 0; i < 6; i++){
105 if(*p == 0)
106 return -1;
107 nip[0] = *p++;
108 if(*p == 0)
109 return -1;
110 nip[1] = *p++;
111 nip[2] = 0;
112 to[i] = strtoul(nip, 0, 16);
113 if(*p == ':')
114 p++;
115 }
116 return 0;
117 }
118
119 int
isaconfig(char * class,int ctlrno,ISAConf * isa)120 isaconfig(char *class, int ctlrno, ISAConf *isa)
121 {
122 char cc[NAMELEN], *p, *q, *r;
123 int n;
124
125 sprint(cc, "%s%d", class, ctlrno);
126 for(n = 0; n < nconf; n++){
127 if(strncmp(confname[n], cc, NAMELEN))
128 continue;
129 isa->nopt = 0;
130 p = confval[n];
131 while(*p){
132 while(*p == ' ' || *p == '\t')
133 p++;
134 if(*p == '\0')
135 break;
136 if(strncmp(p, "type=", 5) == 0){
137 p += 5;
138 for(q = isa->type; q < &isa->type[NAMELEN-1]; q++){
139 if(*p == '\0' || *p == ' ' || *p == '\t')
140 break;
141 *q = *p++;
142 }
143 *q = '\0';
144 }
145 else if(strncmp(p, "port=", 5) == 0)
146 isa->port = strtoul(p+5, &p, 0);
147 else if(strncmp(p, "irq=", 4) == 0)
148 isa->irq = strtoul(p+4, &p, 0);
149 else if(strncmp(p, "mem=", 4) == 0)
150 isa->mem = strtoul(p+4, &p, 0);
151 else if(strncmp(p, "size=", 5) == 0)
152 isa->size = strtoul(p+5, &p, 0);
153 else if(strncmp(p, "ea=", 3) == 0){
154 if(parseether(isa->ea, p+3) == -1)
155 memset(isa->ea, 0, 6);
156 }
157 else if(isa->nopt < NISAOPT){
158 r = isa->opt[isa->nopt];
159 while(*p && *p != ' ' && *p != '\t'){
160 *r++ = *p++;
161 if(r-isa->opt[isa->nopt] >= ISAOPTLEN-1)
162 break;
163 }
164 *r = '\0';
165 isa->nopt++;
166 }
167 while(*p && *p != ' ' && *p != '\t')
168 p++;
169 }
170 return 1;
171 }
172 return 0;
173 }
174