1
#line 1036 "ifupdown.nw"
1
#line 1033 "ifupdown.nw"
7
#line 1047 "ifupdown.nw"
7
#line 1044 "ifupdown.nw"
9
#line 1250 "ifupdown.nw"
9
#line 1263 "ifupdown.nw"
11
#line 1384 "ifupdown.nw"
11
#line 1397 "ifupdown.nw"
13
#line 1227 "ifupdown.nw"
13
#line 1240 "ifupdown.nw"
14
14
static int get_line(char **result, size_t *result_len, FILE *f, int *line);
15
#line 1454 "ifupdown.nw"
15
#line 1467 "ifupdown.nw"
16
16
static char *next_word(char *buf, char *word, int maxlen);
17
#line 1688 "ifupdown.nw"
17
#line 1704 "ifupdown.nw"
18
18
static address_family *get_address_family(address_family *af[], char *name);
19
#line 1723 "ifupdown.nw"
19
#line 1739 "ifupdown.nw"
20
20
static method *get_method(address_family *af, char *name);
21
#line 1784 "ifupdown.nw"
21
#line 1800 "ifupdown.nw"
22
22
static int duplicate_if(interface_defn *ifa, interface_defn *ifb);
23
#line 1160 "ifupdown.nw"
23
#line 1919 "ifupdown.nw"
24
allowup_defn *get_allowup(allowup_defn **allowups, char *name);
26
#line 1957 "ifupdown.nw"
27
allowup_defn *add_allow_up(char *filename, int line,
28
allowup_defn *allow_up, char *iface_name);
29
#line 1174 "ifupdown.nw"
24
30
interfaces_file *read_interfaces(char *filename) {
26
#line 1197 "ifupdown.nw"
32
#line 1210 "ifupdown.nw"
29
#line 1234 "ifupdown.nw"
35
#line 1247 "ifupdown.nw"
31
37
size_t buf_len = 0;
32
#line 1434 "ifupdown.nw"
38
#line 1447 "ifupdown.nw"
33
39
interface_defn *currif = NULL;
34
40
mapping_defn *currmap = NULL;
35
41
enum { NONE, IFACE, MAPPING } currently_processing = NONE;
36
#line 1445 "ifupdown.nw"
42
#line 1458 "ifupdown.nw"
37
43
char firstword[80];
39
#line 1162 "ifupdown.nw"
45
#line 1176 "ifupdown.nw"
40
46
interfaces_file *defn;
43
#line 1181 "ifupdown.nw"
49
#line 1195 "ifupdown.nw"
44
50
defn = malloc(sizeof(interfaces_file));
45
51
if (defn == NULL) {
48
defn->max_autointerfaces = defn->n_autointerfaces = 0;
49
defn->autointerfaces = NULL;
54
defn->allowups = NULL;
50
55
defn->mappings = NULL;
51
56
defn->ifaces = NULL;
52
#line 1165 "ifupdown.nw"
57
#line 1179 "ifupdown.nw"
54
#line 1202 "ifupdown.nw"
59
#line 1215 "ifupdown.nw"
55
60
f = fopen(filename, "r");
56
61
if ( f == NULL ) return NULL;
59
#line 1167 "ifupdown.nw"
64
#line 1181 "ifupdown.nw"
61
#line 1242 "ifupdown.nw"
66
#line 1255 "ifupdown.nw"
62
67
get_line(&buf,&buf_len,f,&line)
63
#line 1167 "ifupdown.nw"
68
#line 1181 "ifupdown.nw"
66
#line 1481 "ifupdown.nw"
71
#line 1494 "ifupdown.nw"
67
72
rest = next_word(buf, firstword, 80);
68
73
if (rest == NULL) continue; /* blank line */
70
75
if (strcmp(firstword, "mapping") == 0) {
72
#line 1530 "ifupdown.nw"
77
#line 1546 "ifupdown.nw"
73
78
currmap = malloc(sizeof(mapping_defn));
74
79
if (currmap == NULL) {
76
#line 1913 "ifupdown.nw"
81
#line 2008 "ifupdown.nw"
79
#line 1533 "ifupdown.nw"
84
#line 1549 "ifupdown.nw"
81
#line 1537 "ifupdown.nw"
86
#line 1553 "ifupdown.nw"
82
87
currmap->max_matches = 0;
83
88
currmap->n_matches = 0;
84
89
currmap->match = NULL;
117
122
*where = currmap;
118
123
currmap->next = NULL;
120
#line 1486 "ifupdown.nw"
125
#line 1499 "ifupdown.nw"
121
126
currently_processing = MAPPING;
122
127
} else if (strcmp(firstword, "iface") == 0) {
124
#line 1619 "ifupdown.nw"
129
#line 1635 "ifupdown.nw"
127
#line 1652 "ifupdown.nw"
132
#line 1668 "ifupdown.nw"
128
133
char iface_name[80];
129
134
char address_family_name[80];
130
135
char method_name[80];
132
#line 1622 "ifupdown.nw"
137
#line 1638 "ifupdown.nw"
134
#line 1640 "ifupdown.nw"
139
#line 1656 "ifupdown.nw"
135
140
currif = malloc(sizeof(interface_defn));
138
#line 1913 "ifupdown.nw"
143
#line 2008 "ifupdown.nw"
139
144
perror(filename);
141
#line 1643 "ifupdown.nw"
146
#line 1659 "ifupdown.nw"
144
#line 1624 "ifupdown.nw"
149
#line 1640 "ifupdown.nw"
146
#line 1658 "ifupdown.nw"
151
#line 1674 "ifupdown.nw"
147
152
rest = next_word(rest, iface_name, 80);
148
153
rest = next_word(rest, address_family_name, 80);
149
154
rest = next_word(rest, method_name, 80);
151
156
if (rest == NULL) {
153
#line 1918 "ifupdown.nw"
158
#line 2013 "ifupdown.nw"
154
159
fprintf(stderr, "%s:%d: too few parameters for iface line\n", filename, line);
156
#line 1664 "ifupdown.nw"
161
#line 1680 "ifupdown.nw"
159
164
if (rest[0] != '\0') {
161
#line 1923 "ifupdown.nw"
166
#line 2018 "ifupdown.nw"
162
167
fprintf(stderr, "%s:%d: too many parameters for iface line\n", filename, line);
164
#line 1668 "ifupdown.nw"
169
#line 1684 "ifupdown.nw"
167
#line 1626 "ifupdown.nw"
169
#line 1674 "ifupdown.nw"
170
currif->iface = strdup(iface_name);
171
if (!currif->iface) {
173
#line 1913 "ifupdown.nw"
172
#line 1642 "ifupdown.nw"
174
#line 1690 "ifupdown.nw"
175
currif->logical_iface = strdup(iface_name);
176
if (!currif->logical_iface) {
178
#line 2008 "ifupdown.nw"
174
179
perror(filename);
176
#line 1677 "ifupdown.nw"
181
#line 1693 "ifupdown.nw"
178
#line 1627 "ifupdown.nw"
183
#line 1643 "ifupdown.nw"
180
#line 1692 "ifupdown.nw"
185
#line 1708 "ifupdown.nw"
181
186
currif->address_family = get_address_family(addr_fams, address_family_name);
182
187
if (!currif->address_family) {
184
#line 1928 "ifupdown.nw"
189
#line 2023 "ifupdown.nw"
185
190
fprintf(stderr, "%s:%d: unknown address type\n", filename, line);
187
#line 1695 "ifupdown.nw"
192
#line 1711 "ifupdown.nw"
189
#line 1628 "ifupdown.nw"
194
#line 1644 "ifupdown.nw"
191
#line 1727 "ifupdown.nw"
196
#line 1743 "ifupdown.nw"
192
197
currif->method = get_method(currif->address_family, method_name);
193
198
if (!currif->method) {
195
#line 1933 "ifupdown.nw"
200
#line 2028 "ifupdown.nw"
196
201
fprintf(stderr, "%s:%d: unknown method\n", filename, line);
198
#line 1730 "ifupdown.nw"
203
#line 1746 "ifupdown.nw"
199
204
return NULL; /* FIXME */
201
#line 1629 "ifupdown.nw"
206
#line 1645 "ifupdown.nw"
203
#line 1750 "ifupdown.nw"
208
#line 1766 "ifupdown.nw"
204
209
currif->automatic = 1;
205
210
currif->max_options = 0;
206
211
currif->n_options = 0;
207
212
currif->option = NULL;
209
#line 1631 "ifupdown.nw"
214
#line 1647 "ifupdown.nw"
211
#line 1766 "ifupdown.nw"
216
#line 1782 "ifupdown.nw"
213
218
interface_defn **where = &defn->ifaces;
214
219
while(*where != NULL) {
215
220
if (duplicate_if(*where, currif)) {
217
#line 1938 "ifupdown.nw"
222
#line 2033 "ifupdown.nw"
218
223
fprintf(stderr, "%s:%d: duplicate interface\n", filename, line);
220
#line 1771 "ifupdown.nw"
225
#line 1787 "ifupdown.nw"
222
227
where = &(*where)->next;
226
231
currif->next = NULL;
228
#line 1632 "ifupdown.nw"
233
#line 1648 "ifupdown.nw"
230
#line 1489 "ifupdown.nw"
235
#line 1502 "ifupdown.nw"
231
236
currently_processing = IFACE;
232
237
} else if (strcmp(firstword, "auto") == 0) {
234
#line 1870 "ifupdown.nw"
235
while((rest = next_word(rest, firstword, 80))) {
237
#line 1877 "ifupdown.nw"
241
for (i = 0; i < defn->n_autointerfaces; i++) {
242
if (strcmp(firstword, defn->autointerfaces[i]) == 0) {
244
#line 1943 "ifupdown.nw"
245
fprintf(stderr, "%s:%d: interface declared auto twice\n", filename, line);
247
#line 1883 "ifupdown.nw"
251
#line 1872 "ifupdown.nw"
253
#line 1889 "ifupdown.nw"
254
if (defn->n_autointerfaces == defn->max_autointerfaces) {
256
defn->max_autointerfaces *= 2;
257
defn->max_autointerfaces++;
258
tmp = realloc(defn->autointerfaces,
259
sizeof(*tmp) * defn->max_autointerfaces);
262
#line 1913 "ifupdown.nw"
265
#line 1897 "ifupdown.nw"
267
defn->autointerfaces = tmp;
270
defn->autointerfaces[defn->n_autointerfaces] = strdup(firstword);
271
defn->n_autointerfaces++;
272
#line 1873 "ifupdown.nw"
274
#line 1492 "ifupdown.nw"
239
#line 1898 "ifupdown.nw"
240
allowup_defn *auto_ups = get_allowup(&defn->allowups, "auto");
243
#line 2008 "ifupdown.nw"
246
#line 1901 "ifupdown.nw"
248
while((rest = next_word(rest, firstword, 80))) {
249
if (!add_allow_up(filename, line, auto_ups, firstword))
252
#line 1505 "ifupdown.nw"
253
currently_processing = NONE;
254
} else if (strncmp(firstword, "allow-", 6) == 0 && strlen(firstword) > 6) {
256
#line 1908 "ifupdown.nw"
257
allowup_defn *allow_ups = get_allowup(&defn->allowups, firstword + 6);
260
#line 2008 "ifupdown.nw"
263
#line 1911 "ifupdown.nw"
265
while((rest = next_word(rest, firstword, 80))) {
266
if (!add_allow_up(filename, line, allow_ups, firstword))
269
#line 1508 "ifupdown.nw"
275
270
currently_processing = NONE;
278
#line 1499 "ifupdown.nw"
273
#line 1515 "ifupdown.nw"
279
274
switch(currently_processing) {
282
#line 1804 "ifupdown.nw"
277
#line 1821 "ifupdown.nw"
278
if (strcmp(firstword, "post-up") == 0) {
279
strcpy(firstword, "up");
281
if (strcmp(firstword, "pre-down") == 0) {
282
strcpy(firstword, "down");
284
#line 1830 "ifupdown.nw"
286
288
if (strlen (rest) == 0) {
288
#line 1963 "ifupdown.nw"
290
#line 2059 "ifupdown.nw"
289
291
fprintf(stderr, "%s:%d: option with empty value\n", filename, line);
291
#line 1809 "ifupdown.nw"
293
#line 1835 "ifupdown.nw"
294
if (strcmp(firstword, "up") != 0
296
if (strcmp(firstword, "pre-up") != 0
297
&& strcmp(firstword, "up") != 0
295
298
&& strcmp(firstword, "down") != 0
296
&& strcmp(firstword, "pre-up") != 0
297
299
&& strcmp(firstword, "post-down") != 0)
299
301
for (i = 0; i < currif->n_options; i++) {
300
302
if (strcmp(currif->option[i].name, firstword) == 0) {
302
#line 1948 "ifupdown.nw"
304
#line 2044 "ifupdown.nw"
303
305
fprintf(stderr, "%s:%d: duplicate option\n", filename, line);
305
#line 1819 "ifupdown.nw"
307
#line 1845 "ifupdown.nw"
310
#line 1831 "ifupdown.nw"
312
#line 1857 "ifupdown.nw"
311
313
if (currif->n_options >= currif->max_options) {
313
#line 1853 "ifupdown.nw"
315
#line 1879 "ifupdown.nw"
316
318
currif->max_options = currif->max_options + 10;
317
319
opt = realloc(currif->option, sizeof(*opt) * currif->max_options);
318
320
if (opt == NULL) {
320
#line 1913 "ifupdown.nw"
322
#line 2008 "ifupdown.nw"
321
323
perror(filename);
325
#line 1885 "ifupdown.nw"
327
currif->option = opt;
323
329
#line 1859 "ifupdown.nw"
325
currif->option = opt;
327
#line 1833 "ifupdown.nw"
330
332
currif->option[currif->n_options].name = strdup(firstword);
333
335
if (!currif->option[currif->n_options].name) {
335
#line 1913 "ifupdown.nw"
337
#line 2008 "ifupdown.nw"
336
338
perror(filename);
338
#line 1840 "ifupdown.nw"
340
#line 1866 "ifupdown.nw"
341
343
if (!currif->option[currif->n_options].value) {
343
#line 1913 "ifupdown.nw"
345
#line 2008 "ifupdown.nw"
344
346
perror(filename);
346
#line 1844 "ifupdown.nw"
348
#line 1870 "ifupdown.nw"
349
351
currif->n_options++;
350
#line 1502 "ifupdown.nw"
352
#line 1518 "ifupdown.nw"
354
#line 1582 "ifupdown.nw"
356
#line 1598 "ifupdown.nw"
355
357
if (strcmp(firstword, "script") == 0) {
357
#line 1592 "ifupdown.nw"
359
#line 1608 "ifupdown.nw"
358
360
if (currmap->script != NULL) {
360
#line 1953 "ifupdown.nw"
362
#line 2049 "ifupdown.nw"
361
363
fprintf(stderr, "%s:%d: duplicate script in mapping\n", filename, line);
363
#line 1594 "ifupdown.nw"
365
#line 1610 "ifupdown.nw"
365
367
currmap->script = strdup(rest);
367
#line 1584 "ifupdown.nw"
369
#line 1600 "ifupdown.nw"
368
370
} else if (strcmp(firstword, "map") == 0) {
370
#line 1600 "ifupdown.nw"
372
#line 1616 "ifupdown.nw"
371
373
if (currmap->max_mappings == currmap->n_mappings) {
373
375
currmap->max_mappings = currmap->max_mappings * 2 + 1;
374
376
opt = realloc(currmap->mapping, sizeof(*opt) * currmap->max_mappings);
375
377
if (opt == NULL) {
377
#line 1913 "ifupdown.nw"
379
#line 2008 "ifupdown.nw"
378
380
perror(filename);
380
#line 1606 "ifupdown.nw"
382
#line 1622 "ifupdown.nw"
382
384
currmap->mapping = opt;
384
386
currmap->mapping[currmap->n_mappings] = strdup(rest);
385
387
currmap->n_mappings++;
386
#line 1586 "ifupdown.nw"
388
#line 1602 "ifupdown.nw"
389
#line 1958 "ifupdown.nw"
391
#line 2054 "ifupdown.nw"
390
392
fprintf(stderr, "%s:%d: misplaced option\n", filename, line);
392
#line 1588 "ifupdown.nw"
394
#line 1604 "ifupdown.nw"
394
#line 1505 "ifupdown.nw"
396
#line 1521 "ifupdown.nw"
399
#line 1958 "ifupdown.nw"
401
#line 2054 "ifupdown.nw"
400
402
fprintf(stderr, "%s:%d: misplaced option\n", filename, line);
402
#line 1509 "ifupdown.nw"
404
#line 1495 "ifupdown.nw"
406
#line 1169 "ifupdown.nw"
404
#line 1525 "ifupdown.nw"
406
#line 1511 "ifupdown.nw"
408
#line 1183 "ifupdown.nw"
409
#line 1254 "ifupdown.nw"
411
#line 1267 "ifupdown.nw"
411
#line 1170 "ifupdown.nw"
413
#line 1184 "ifupdown.nw"
414
#line 1913 "ifupdown.nw"
416
#line 2008 "ifupdown.nw"
415
417
perror(filename);
417
#line 1172 "ifupdown.nw"
419
#line 1186 "ifupdown.nw"
421
#line 1208 "ifupdown.nw"
423
#line 1221 "ifupdown.nw"
425
#line 1176 "ifupdown.nw"
427
#line 1190 "ifupdown.nw"
428
#line 1267 "ifupdown.nw"
430
#line 1280 "ifupdown.nw"
429
431
static int get_line(char **result, size_t *result_len, FILE *f, int *line) {
431
#line 1292 "ifupdown.nw"
433
#line 1305 "ifupdown.nw"
434
#line 1270 "ifupdown.nw"
436
#line 1283 "ifupdown.nw"
437
#line 1299 "ifupdown.nw"
439
#line 1312 "ifupdown.nw"
439
#line 1272 "ifupdown.nw"
441
#line 1285 "ifupdown.nw"
441
#line 1310 "ifupdown.nw"
443
#line 1323 "ifupdown.nw"
444
#line 1331 "ifupdown.nw"
446
#line 1344 "ifupdown.nw"
445
447
if (*result_len - pos < 10) {
446
448
char *newstr = realloc(*result, *result_len * 2 + 80);
447
449
if (newstr == NULL) {
450
452
*result = newstr;
451
453
*result_len = *result_len * 2 + 80;
453
#line 1312 "ifupdown.nw"
455
#line 1325 "ifupdown.nw"
455
#line 1360 "ifupdown.nw"
457
#line 1373 "ifupdown.nw"
456
458
if (!fgets(*result + pos, *result_len - pos, f)) {
457
459
if (ferror(f) == 0 && pos == 0) return 0;
458
460
if (ferror(f) != 0) return 0;
460
462
pos += strlen(*result + pos);
461
#line 1313 "ifupdown.nw"
463
#line 1326 "ifupdown.nw"
463
#line 1351 "ifupdown.nw"
465
#line 1364 "ifupdown.nw"
464
466
pos == *result_len - 1 && (*result)[pos-1] != '\n'
465
#line 1313 "ifupdown.nw"
467
#line 1326 "ifupdown.nw"
468
#line 1372 "ifupdown.nw"
470
#line 1385 "ifupdown.nw"
469
471
if (pos != 0 && (*result)[pos-1] == '\n') {
470
472
(*result)[--pos] = '\0';
473
#line 1317 "ifupdown.nw"
475
#line 1330 "ifupdown.nw"
476
478
assert( (*result)[pos] == '\0' );
477
#line 1273 "ifupdown.nw"
479
#line 1286 "ifupdown.nw"
479
#line 1388 "ifupdown.nw"
481
#line 1401 "ifupdown.nw"
482
484
while (isspace((*result)[first]) && (*result)[first]) {
515
517
*result = newstr;
516
518
*result_len = *result_len * 2 + 80;
518
#line 1312 "ifupdown.nw"
520
#line 1325 "ifupdown.nw"
520
#line 1360 "ifupdown.nw"
522
#line 1373 "ifupdown.nw"
521
523
if (!fgets(*result + pos, *result_len - pos, f)) {
522
524
if (ferror(f) == 0 && pos == 0) return 0;
523
525
if (ferror(f) != 0) return 0;
525
527
pos += strlen(*result + pos);
526
#line 1313 "ifupdown.nw"
528
#line 1326 "ifupdown.nw"
528
#line 1351 "ifupdown.nw"
530
#line 1364 "ifupdown.nw"
529
531
pos == *result_len - 1 && (*result)[pos-1] != '\n'
530
#line 1313 "ifupdown.nw"
532
#line 1326 "ifupdown.nw"
533
#line 1372 "ifupdown.nw"
535
#line 1385 "ifupdown.nw"
534
536
if (pos != 0 && (*result)[pos-1] == '\n') {
535
537
(*result)[--pos] = '\0';
538
#line 1317 "ifupdown.nw"
540
#line 1330 "ifupdown.nw"
541
543
assert( (*result)[pos] == '\0' );
542
#line 1279 "ifupdown.nw"
544
#line 1292 "ifupdown.nw"
546
#line 1400 "ifupdown.nw"
548
#line 1413 "ifupdown.nw"
547
549
while (isspace((*result)[pos-1])) { /* remove trailing whitespace */
550
552
(*result)[pos] = '\0';
552
#line 1283 "ifupdown.nw"
554
#line 1296 "ifupdown.nw"
555
#line 1458 "ifupdown.nw"
557
#line 1471 "ifupdown.nw"
556
558
static char *next_word(char *buf, char *word, int maxlen) {
557
559
if (!buf) return NULL;
558
560
if (!*buf) return NULL;
590
#line 1788 "ifupdown.nw"
592
#line 1804 "ifupdown.nw"
591
593
static int duplicate_if(interface_defn *ifa, interface_defn *ifb) {
592
if (strcmp(ifa->iface, ifb->iface) != 0) return 0;
594
if (strcmp(ifa->logical_iface, ifb->logical_iface) != 0) return 0;
593
595
if (ifa->address_family != ifb->address_family) return 0;
598
#line 1922 "ifupdown.nw"
599
allowup_defn *get_allowup(allowup_defn **allowups, char *name) {
600
for (; *allowups; allowups = &(*allowups)->next) {
601
if (strcmp((*allowups)->when, name) == 0) break;
603
if (*allowups == NULL) {
604
*allowups = malloc(sizeof(allowup_defn));
605
if (*allowups == NULL) return NULL;
606
(*allowups)->when = strdup(name);
607
(*allowups)->next = NULL;
608
(*allowups)->max_interfaces = 0;
609
(*allowups)->n_interfaces = 0;
610
(*allowups)->interfaces = NULL;
614
#line 1947 "ifupdown.nw"
615
allowup_defn *find_allowup(interfaces_file *defn, char *name) {
616
allowup_defn *allowups = defn->allowups;
617
for (; allowups; allowups = allowups->next) {
618
if (strcmp(allowups->when, name) == 0) break;
622
#line 1962 "ifupdown.nw"
623
allowup_defn *add_allow_up(char *filename, int line,
624
allowup_defn *allow_up, char *iface_name)
627
#line 1972 "ifupdown.nw"
631
for (i = 0; i < allow_up->n_interfaces; i++) {
632
if (strcmp(iface_name, allow_up->interfaces[i]) == 0) {
634
#line 2038 "ifupdown.nw"
635
fprintf(stderr, "%s:%d: interface %s declared allow-%s twice\n",
636
filename, line, iface_name, allow_up->when);
638
#line 1978 "ifupdown.nw"
642
#line 1966 "ifupdown.nw"
644
#line 1984 "ifupdown.nw"
645
if (allow_up->n_interfaces == allow_up->max_interfaces) {
647
allow_up->max_interfaces *= 2;
648
allow_up->max_interfaces++;
649
tmp = realloc(allow_up->interfaces,
650
sizeof(*tmp) * allow_up->max_interfaces);
653
#line 2008 "ifupdown.nw"
656
#line 1992 "ifupdown.nw"
658
allow_up->interfaces = tmp;
661
allow_up->interfaces[allow_up->n_interfaces] = strdup(iface_name);
662
allow_up->n_interfaces++;
663
#line 1967 "ifupdown.nw"