conf.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
conf.c (5175B)
---
1 #include "u.h"
2 #include "lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6
7 #include "fs.h"
8
9 #include "conf.h"
10
11 #include "netif.h"
12 #include "etherif.h"
13 #include "vether.h"
14
15 char filebuf[BOOTARGSLEN];
16
17 static void
18 addether(char *name, char *value)
19 {
20 char *p, *q;
21 int ctlrno;
22
23 ctlrno = atoi(&name[5]);
24 if(ctlrno > MaxEther)
25 return;
26 p = value;
27 /* default ea = 00:00:09:00:00:xx */
28 memset(ve[ctlrno].ea, 0, 6);
29 ve[ctlrno].ea[2] = 9;
30 ve[ctlrno].ea[5] = ctlrno;
31 while(*p){
32 while(*p == ' ' || *p == '\t')
33 p++;
34 if(*p == '\0')
35 break;
36 if(strncmp(p, "type=", 5) == 0){
37 p += 5;
38 if(strncmp(p, "tap", 3) == 0)
39 ve[ctlrno].tap = 1;
40 else if(strncmp(p, "pcap", 4) == 0)
41 ve[ctlrno].tap = 0;
42 else
43 return;
44 }
45 else if(strncmp(p, "dev=", 4) == 0){
46 p += 4;
47 q = p;
48 while(*q && *q != ' ' && *q != '\t')
49 q++;
50 ve[ctlrno].dev = malloc(q - p + 1);
51 strncpy(ve[ctlrno].dev, p, q - p);
52 ve[ctlrno].dev[q-p] = '\0';
53 continue;
54 }
55 else if(strncmp(p, "ea=", 3) == 0){
56 if(parseether(ve[ctlrno].ea, p+3) == -1)
57 memset(ve[ctlrno].ea, 0, 6);
58 }
59 while(*p && *p != ' ' && *p != '\t')
60 p++;
61 }
62 nve++;
63 }
64
65 void
66 setinioptions()
67 {
68 static int i;
69 char *name, *value;
70
71 for(; i < MAXCONF; i++){
72 if(!inifield[i])
73 break;
74 name = inifield[i];
75 if(*name == '*')
76 name++;
77 value = strchr(inifield[i], '=');
78 if(value == 0)
79 continue;
80 *value++ = 0;
81 if(strcmp(name, "cpulimit") == 0)
82 cpulimit = atoi(value);
83 else if(strcmp(name, "memsize") == 0)
84 memsize = atoi(value);
85 else if(strcmp(name, "canopenpath") == 0)
86 canopen = value;
87 else if(strncmp(name, "ether", 5) == 0)
88 addether(name, value);
89 else if(strcmp(name, "initarg") == 0)
90 initarg = value;
91 else if(strcmp(name, "localroot") == 0)
92 localroot = value;
93 else if(strcmp(name, "user") == 0)
94 username = value;
95 /* Restore '=' for setinienv and printconfig */
96 *(--value) = '=';
97 }
98 }
99
100 void
101 addini(char *buf)
102 {
103 static int n = 0;
104 int blankline, incomment, inspace, inquote;
105 char *p, *q;
106
107 /*
108 * Strip out '\r', change '\t' -> ' '.
109 * Change runs of spaces into single spaces.
110 * Strip out trailing spaces, blank lines.
111 * The text between single quotes is not touched.
112 *
113 * We do this before we make the copy so that if we
114 * need to change the copy, it is already fairly clean.
115 * The main need is in the case when plan9.ini has been
116 * padded with lots of trailing spaces, as is the case
117 * for those created during a distribution install.
118 */
119 p = buf;
120 blankline = 1;
121 incomment = inquote =inspace = 0;
122 for(q = buf; *q; q++){
123 if(inquote){
124 if(*q == '\'')
125 inquote = 0;
126 *p++ = *q;
127 continue;
128 }
129 if(!incomment && *q == '\'')
130 inquote = 1;
131 if(*q == '\r')
132 continue;
133 if(*q == '\t')
134 *q = ' ';
135 if(*q == ' '){
136 inspace = 1;
137 continue;
138 }
139 if(*q == '\n'){
140 if(!blankline){
141 if(!incomment)
142 *p++ = '\n';
143 blankline = 1;
144 }
145 incomment = inspace = 0;
146 continue;
147 }
148 if(inspace){
149 if(!blankline && !incomment)
150 *p++ = ' ';
151 inspace = 0;
152 }
153 if(blankline && *q == '#')
154 incomment = 1;
155 blankline = 0;
156 if(!incomment)
157 *p++ = *q;
158 }
159 *p++ = 0;
160
161 n += gettokens(buf, &inifield[n], MAXCONF-n, "\n");
162 setinioptions();
163 }
164
165 int
166 addinifile(char *file)
167 {
168 static char *fb = filebuf;
169 char *buf;
170 int n, fd;
171
172 if(strcmp(file, "-") == 0)
173 fd = fileno(stdin);
174 else if((fd = open(file, OREAD)) < 0)
175 return -1;
176
177 buf = fb;
178 *buf = 0;
179 while((n = read(fd, buf, BOOTARGSLEN-1)) > 0)
180 if(n<0)
181 return -1;
182 else
183 buf += n;
184 close(fd);
185 *buf = 0;
186 addini(fb);
187 fb = buf;
188 return n;
189 }
190
191 char*
192 fullpath(char *root) {
193 char cwd[1024];
194
195 if(root[0] != '/'){
196 if(getcwd(cwd, sizeof cwd) == nil)
197 panic("getcwd: %r");
198 root = cleanname(smprint("%s/%s", cwd, root));
199 }
200 return root;
201 }
202
203 /*
204 * Poor man's quotestrdup to avoid needing quote.c
205 */
206 char*
207 quoted(char *in) {
208 char *out, *p;
209 int i, n;
210
211 n = 0;
212 for(i = 0; i < strlen(in); i++)
213 if(in[i] == '\'')
214 n++;
215 out = malloc(strlen(in) + n + 2);
216 p = out;
217 if(*in != '\'')
218 *p++ = '\'';
219 for(i = 0; i < strlen(in); i++){
220 if(in[i] == '\'')
221 *p++ = in[i];
222 *p++ = in[i];
223 }
224 *p++ = '\'';
225 *p = 0;
226 return out;
227 }
228
229 void
230 setinienv()
231 {
232 int i;
233 char *name, *value;
234
235 for(i = 0; i < MAXCONF; i++){
236 if(!inifield[i])
237 break;
238 name = inifield[i];
239 value = strchr(inifield[i], '=');
240 if(*name == '*' || value == 0 || value[0] == 0)
241 continue;
242 *value++ = 0;
243 ksetenv(name, value, 0);
244 }
245 if(initarg){
246 if(*initarg != '\'')
247 initarg = quoted(initarg);
248 value = smprint("/386/init -t %s", initarg);
249 ksetenv("init", value, 0);
250 }
251 if(localroot){
252 value = smprint("local!#Z%s", fullpath(localroot));
253 ksetenv("nobootprompt", value, 0);
254 }
255 ksetenv("user", username, 0);
256 }
257
258 /*
259 * Debugging: tell user what options we guessed.
260 */
261 void
262 printconfig(char *argv0){
263 int i;
264
265 print(argv0);
266 if(usetty)
267 print(" -%c", nogui ? 'g' : 't');
268 print(" \n");
269 for(i = 0; i < MAXCONF; i++){
270 if(!inifield[i])
271 break;
272 print("\t%s\n", inifield[i]);
273 }
274 if(initarg)
275 print("\tinit=/386/init -t %s\n", initarg);
276 if(localroot)
277 print("\tnobootprompt=#Z%s\n", localroot);
278 print("\tuser=%s\n", username);
279 }