~ubuntu-branches/ubuntu/jaunty/ifupdown/jaunty-201309120846

« back to all changes in this revision

Viewing changes to config.c

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-05-27 06:43:06 UTC
  • mfrom: (2.1.1 sarge)
  • Revision ID: james.westby@ubuntu.com-20050527064306-mmu0c9p8os37l3bq
Tags: 0.6.7ubuntu1
* Resynchronise with Debian, resolving merge conflicts.
* Remove the initscripts dependency, since we now use our own readlink.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#line 1036 "ifupdown.nw"
 
1
#line 1033 "ifupdown.nw"
2
2
#include <stdlib.h>
3
3
#include <stdio.h>
4
4
#include <string.h>
5
5
#include <errno.h>
6
6
#include <assert.h>
7
 
#line 1047 "ifupdown.nw"
 
7
#line 1044 "ifupdown.nw"
8
8
#include "header.h"
9
 
#line 1250 "ifupdown.nw"
 
9
#line 1263 "ifupdown.nw"
10
10
#include <errno.h>
11
 
#line 1384 "ifupdown.nw"
 
11
#line 1397 "ifupdown.nw"
12
12
#include <ctype.h>
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);
 
25
 
 
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) {
25
31
        
26
 
#line 1197 "ifupdown.nw"
 
32
#line 1210 "ifupdown.nw"
27
33
FILE *f;
28
34
int line;
29
 
#line 1234 "ifupdown.nw"
 
35
#line 1247 "ifupdown.nw"
30
36
char *buf = NULL;
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];
38
44
char *rest;
39
 
#line 1162 "ifupdown.nw"
 
45
#line 1176 "ifupdown.nw"
40
46
        interfaces_file *defn;
41
47
 
42
48
        
43
 
#line 1181 "ifupdown.nw"
 
49
#line 1195 "ifupdown.nw"
44
50
defn = malloc(sizeof(interfaces_file));
45
51
if (defn == NULL) {
46
52
        return NULL;
47
53
}
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"
53
58
        
54
 
#line 1202 "ifupdown.nw"
 
59
#line 1215 "ifupdown.nw"
55
60
f = fopen(filename, "r");
56
61
if ( f == NULL ) return NULL;
57
62
line = 0;
58
63
 
59
 
#line 1167 "ifupdown.nw"
 
64
#line 1181 "ifupdown.nw"
60
65
        while (
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"
64
69
                                             ) {
65
70
                
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 */
69
74
 
70
75
if (strcmp(firstword, "mapping") == 0) {
71
76
        
72
 
#line 1530 "ifupdown.nw"
 
77
#line 1546 "ifupdown.nw"
73
78
currmap = malloc(sizeof(mapping_defn));
74
79
if (currmap == NULL) {
75
80
        
76
 
#line 1913 "ifupdown.nw"
 
81
#line 2008 "ifupdown.nw"
77
82
perror(filename);
78
83
return NULL;
79
 
#line 1533 "ifupdown.nw"
 
84
#line 1549 "ifupdown.nw"
80
85
}
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;
92
97
                if (tmp == NULL) {
93
98
                        currmap->max_matches = (currmap->max_matches - 1) / 2;
94
99
                        
95
 
#line 1913 "ifupdown.nw"
 
100
#line 2008 "ifupdown.nw"
96
101
perror(filename);
97
102
return NULL;
98
 
#line 1550 "ifupdown.nw"
 
103
#line 1566 "ifupdown.nw"
99
104
                }
100
105
                currmap->match = tmp;
101
106
        }
102
107
 
103
108
        currmap->match[currmap->n_matches++] = strdup(firstword);
104
109
}
105
 
#line 1559 "ifupdown.nw"
 
110
#line 1575 "ifupdown.nw"
106
111
currmap->script = NULL;
107
112
 
108
113
currmap->max_mappings = 0;
109
114
currmap->n_mappings = 0;
110
115
currmap->mapping = NULL;
111
 
#line 1567 "ifupdown.nw"
 
116
#line 1583 "ifupdown.nw"
112
117
{
113
118
        mapping_defn **where = &defn->mappings;
114
119
        while(*where != NULL) {
117
122
        *where = currmap;
118
123
        currmap->next = NULL;
119
124
}
120
 
#line 1486 "ifupdown.nw"
 
125
#line 1499 "ifupdown.nw"
121
126
        currently_processing = MAPPING;
122
127
} else if (strcmp(firstword, "iface") == 0) {
123
128
        
124
 
#line 1619 "ifupdown.nw"
 
129
#line 1635 "ifupdown.nw"
125
130
{
126
131
        
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];
131
136
 
132
 
#line 1622 "ifupdown.nw"
 
137
#line 1638 "ifupdown.nw"
133
138
        
134
 
#line 1640 "ifupdown.nw"
 
139
#line 1656 "ifupdown.nw"
135
140
currif = malloc(sizeof(interface_defn));
136
141
if (!currif) {
137
142
        
138
 
#line 1913 "ifupdown.nw"
 
143
#line 2008 "ifupdown.nw"
139
144
perror(filename);
140
145
return NULL;
141
 
#line 1643 "ifupdown.nw"
 
146
#line 1659 "ifupdown.nw"
142
147
}
143
148
 
144
 
#line 1624 "ifupdown.nw"
 
149
#line 1640 "ifupdown.nw"
145
150
        
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);
150
155
 
151
156
if (rest == NULL) {
152
157
        
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);
155
160
return NULL;
156
 
#line 1664 "ifupdown.nw"
 
161
#line 1680 "ifupdown.nw"
157
162
}
158
163
 
159
164
if (rest[0] != '\0') {
160
165
        
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);
163
168
return NULL;
164
 
#line 1668 "ifupdown.nw"
 
169
#line 1684 "ifupdown.nw"
165
170
}
166
171
 
167
 
#line 1626 "ifupdown.nw"
168
 
        
169
 
#line 1674 "ifupdown.nw"
170
 
currif->iface = strdup(iface_name);
171
 
if (!currif->iface) {
172
 
        
173
 
#line 1913 "ifupdown.nw"
 
172
#line 1642 "ifupdown.nw"
 
173
        
 
174
#line 1690 "ifupdown.nw"
 
175
currif->logical_iface = strdup(iface_name);
 
176
if (!currif->logical_iface) {
 
177
        
 
178
#line 2008 "ifupdown.nw"
174
179
perror(filename);
175
180
return NULL;
176
 
#line 1677 "ifupdown.nw"
 
181
#line 1693 "ifupdown.nw"
177
182
}
178
 
#line 1627 "ifupdown.nw"
 
183
#line 1643 "ifupdown.nw"
179
184
        
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) {
183
188
        
184
 
#line 1928 "ifupdown.nw"
 
189
#line 2023 "ifupdown.nw"
185
190
fprintf(stderr, "%s:%d: unknown address type\n", filename, line);
186
191
return NULL;
187
 
#line 1695 "ifupdown.nw"
 
192
#line 1711 "ifupdown.nw"
188
193
}
189
 
#line 1628 "ifupdown.nw"
 
194
#line 1644 "ifupdown.nw"
190
195
        
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) {
194
199
        
195
 
#line 1933 "ifupdown.nw"
 
200
#line 2028 "ifupdown.nw"
196
201
fprintf(stderr, "%s:%d: unknown method\n", filename, line);
197
202
return NULL;
198
 
#line 1730 "ifupdown.nw"
 
203
#line 1746 "ifupdown.nw"
199
204
        return NULL; /* FIXME */
200
205
}
201
 
#line 1629 "ifupdown.nw"
 
206
#line 1645 "ifupdown.nw"
202
207
        
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;
208
213
 
209
 
#line 1631 "ifupdown.nw"
 
214
#line 1647 "ifupdown.nw"
210
215
        
211
 
#line 1766 "ifupdown.nw"
 
216
#line 1782 "ifupdown.nw"
212
217
{
213
218
        interface_defn **where = &defn->ifaces; 
214
219
        while(*where != NULL) {
215
220
                if (duplicate_if(*where, currif)) {
216
221
                        
217
 
#line 1938 "ifupdown.nw"
 
222
#line 2033 "ifupdown.nw"
218
223
fprintf(stderr, "%s:%d: duplicate interface\n", filename, line);
219
224
return NULL;
220
 
#line 1771 "ifupdown.nw"
 
225
#line 1787 "ifupdown.nw"
221
226
                }
222
227
                where = &(*where)->next;
223
228
        }
225
230
        *where = currif;
226
231
        currif->next = NULL;
227
232
}
228
 
#line 1632 "ifupdown.nw"
 
233
#line 1648 "ifupdown.nw"
229
234
}
230
 
#line 1489 "ifupdown.nw"
 
235
#line 1502 "ifupdown.nw"
231
236
        currently_processing = IFACE;
232
237
} else if (strcmp(firstword, "auto") == 0) {
233
238
        
234
 
#line 1870 "ifupdown.nw"
235
 
while((rest = next_word(rest, firstword, 80))) {
236
 
        
237
 
#line 1877 "ifupdown.nw"
238
 
{
239
 
        int i;
240
 
 
241
 
        for (i = 0; i < defn->n_autointerfaces; i++) {
242
 
                if (strcmp(firstword, defn->autointerfaces[i]) == 0) {
243
 
                        
244
 
#line 1943 "ifupdown.nw"
245
 
fprintf(stderr, "%s:%d: interface declared auto twice\n", filename, line);
246
 
return NULL;
247
 
#line 1883 "ifupdown.nw"
248
 
                }
249
 
        }
250
 
}
251
 
#line 1872 "ifupdown.nw"
252
 
        
253
 
#line 1889 "ifupdown.nw"
254
 
if (defn->n_autointerfaces == defn->max_autointerfaces) {
255
 
        char **tmp;
256
 
        defn->max_autointerfaces *= 2;
257
 
        defn->max_autointerfaces++;
258
 
        tmp = realloc(defn->autointerfaces, 
259
 
                sizeof(*tmp) * defn->max_autointerfaces);
260
 
        if (tmp == NULL) {
261
 
                
262
 
#line 1913 "ifupdown.nw"
263
 
perror(filename);
264
 
return NULL;
265
 
#line 1897 "ifupdown.nw"
266
 
        }
267
 
        defn->autointerfaces = tmp;
268
 
}
269
 
 
270
 
defn->autointerfaces[defn->n_autointerfaces] = strdup(firstword);
271
 
defn->n_autointerfaces++;
272
 
#line 1873 "ifupdown.nw"
273
 
}
274
 
#line 1492 "ifupdown.nw"
 
239
#line 1898 "ifupdown.nw"
 
240
allowup_defn *auto_ups = get_allowup(&defn->allowups, "auto");
 
241
if (!auto_ups) {
 
242
        
 
243
#line 2008 "ifupdown.nw"
 
244
perror(filename);
 
245
return NULL;
 
246
#line 1901 "ifupdown.nw"
 
247
}
 
248
while((rest = next_word(rest, firstword, 80))) {
 
249
        if (!add_allow_up(filename, line, auto_ups, firstword))
 
250
                return NULL;
 
251
}
 
252
#line 1505 "ifupdown.nw"
 
253
        currently_processing = NONE;
 
254
} else if (strncmp(firstword, "allow-", 6) == 0 && strlen(firstword) > 6) {
 
255
        
 
256
#line 1908 "ifupdown.nw"
 
257
allowup_defn *allow_ups = get_allowup(&defn->allowups, firstword + 6);
 
258
if (!allow_ups) {
 
259
        
 
260
#line 2008 "ifupdown.nw"
 
261
perror(filename);
 
262
return NULL;
 
263
#line 1911 "ifupdown.nw"
 
264
}
 
265
while((rest = next_word(rest, firstword, 80))) {
 
266
        if (!add_allow_up(filename, line, allow_ups, firstword))
 
267
                return NULL;
 
268
}
 
269
#line 1508 "ifupdown.nw"
275
270
        currently_processing = NONE;
276
271
} else {
277
272
        
278
 
#line 1499 "ifupdown.nw"
 
273
#line 1515 "ifupdown.nw"
279
274
switch(currently_processing) {
280
275
        case IFACE:
281
276
                
282
 
#line 1804 "ifupdown.nw"
 
277
#line 1821 "ifupdown.nw"
 
278
if (strcmp(firstword, "post-up") == 0) {
 
279
        strcpy(firstword, "up");
 
280
}
 
281
if (strcmp(firstword, "pre-down") == 0) {
 
282
        strcpy(firstword, "down");
 
283
 
284
#line 1830 "ifupdown.nw"
283
285
{
284
286
        int i;
285
287
 
286
288
        if (strlen (rest) == 0) {
287
289
                
288
 
#line 1963 "ifupdown.nw"
 
290
#line 2059 "ifupdown.nw"
289
291
fprintf(stderr, "%s:%d: option with empty value\n", filename, line);
290
292
return NULL;
291
 
#line 1809 "ifupdown.nw"
 
293
#line 1835 "ifupdown.nw"
292
294
        }
293
295
 
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)
298
300
        {
299
301
                for (i = 0; i < currif->n_options; i++) {
300
302
                        if (strcmp(currif->option[i].name, firstword) == 0) {
301
303
                                
302
 
#line 1948 "ifupdown.nw"
 
304
#line 2044 "ifupdown.nw"
303
305
fprintf(stderr, "%s:%d: duplicate option\n", filename, line);
304
306
return NULL;
305
 
#line 1819 "ifupdown.nw"
 
307
#line 1845 "ifupdown.nw"
306
308
                        }
307
309
                }
308
310
        }
309
311
}
310
 
#line 1831 "ifupdown.nw"
 
312
#line 1857 "ifupdown.nw"
311
313
if (currif->n_options >= currif->max_options) {
312
314
        
313
 
#line 1853 "ifupdown.nw"
 
315
#line 1879 "ifupdown.nw"
314
316
{
315
317
        variable *opt;
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) {
319
321
                
320
 
#line 1913 "ifupdown.nw"
 
322
#line 2008 "ifupdown.nw"
321
323
perror(filename);
322
324
return NULL;
 
325
#line 1885 "ifupdown.nw"
 
326
        }
 
327
        currif->option = opt;
 
328
}
323
329
#line 1859 "ifupdown.nw"
324
 
        }
325
 
        currif->option = opt;
326
 
}
327
 
#line 1833 "ifupdown.nw"
328
330
}
329
331
 
330
332
currif->option[currif->n_options].name = strdup(firstword);
332
334
 
333
335
if (!currif->option[currif->n_options].name) {
334
336
        
335
 
#line 1913 "ifupdown.nw"
 
337
#line 2008 "ifupdown.nw"
336
338
perror(filename);
337
339
return NULL;
338
 
#line 1840 "ifupdown.nw"
 
340
#line 1866 "ifupdown.nw"
339
341
}
340
342
 
341
343
if (!currif->option[currif->n_options].value) {
342
344
        
343
 
#line 1913 "ifupdown.nw"
 
345
#line 2008 "ifupdown.nw"
344
346
perror(filename);
345
347
return NULL;
346
 
#line 1844 "ifupdown.nw"
 
348
#line 1870 "ifupdown.nw"
347
349
}
348
350
 
349
351
currif->n_options++;    
350
 
#line 1502 "ifupdown.nw"
 
352
#line 1518 "ifupdown.nw"
351
353
                break;
352
354
        case MAPPING:
353
355
                
354
 
#line 1582 "ifupdown.nw"
 
356
#line 1598 "ifupdown.nw"
355
357
if (strcmp(firstword, "script") == 0) {
356
358
        
357
 
#line 1592 "ifupdown.nw"
 
359
#line 1608 "ifupdown.nw"
358
360
if (currmap->script != NULL) {
359
361
        
360
 
#line 1953 "ifupdown.nw"
 
362
#line 2049 "ifupdown.nw"
361
363
fprintf(stderr, "%s:%d: duplicate script in mapping\n", filename, line);
362
364
return NULL;
363
 
#line 1594 "ifupdown.nw"
 
365
#line 1610 "ifupdown.nw"
364
366
} else {
365
367
        currmap->script = strdup(rest);
366
368
}
367
 
#line 1584 "ifupdown.nw"
 
369
#line 1600 "ifupdown.nw"
368
370
} else if (strcmp(firstword, "map") == 0) {
369
371
        
370
 
#line 1600 "ifupdown.nw"
 
372
#line 1616 "ifupdown.nw"
371
373
if (currmap->max_mappings == currmap->n_mappings) {
372
374
        char **opt;
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) {
376
378
                
377
 
#line 1913 "ifupdown.nw"
 
379
#line 2008 "ifupdown.nw"
378
380
perror(filename);
379
381
return NULL;
380
 
#line 1606 "ifupdown.nw"
 
382
#line 1622 "ifupdown.nw"
381
383
        }
382
384
        currmap->mapping = opt;
383
385
}
384
386
currmap->mapping[currmap->n_mappings] = strdup(rest);
385
387
currmap->n_mappings++;
386
 
#line 1586 "ifupdown.nw"
 
388
#line 1602 "ifupdown.nw"
387
389
} else {
388
390
        
389
 
#line 1958 "ifupdown.nw"
 
391
#line 2054 "ifupdown.nw"
390
392
fprintf(stderr, "%s:%d: misplaced option\n", filename, line);
391
393
return NULL;
392
 
#line 1588 "ifupdown.nw"
 
394
#line 1604 "ifupdown.nw"
393
395
}
394
 
#line 1505 "ifupdown.nw"
 
396
#line 1521 "ifupdown.nw"
395
397
                break;
396
398
        case NONE:
397
399
        default:
398
400
                
399
 
#line 1958 "ifupdown.nw"
 
401
#line 2054 "ifupdown.nw"
400
402
fprintf(stderr, "%s:%d: misplaced option\n", filename, line);
401
403
return NULL;
402
 
#line 1509 "ifupdown.nw"
403
 
}
404
 
#line 1495 "ifupdown.nw"
405
 
}
406
 
#line 1169 "ifupdown.nw"
 
404
#line 1525 "ifupdown.nw"
 
405
}
 
406
#line 1511 "ifupdown.nw"
 
407
}
 
408
#line 1183 "ifupdown.nw"
407
409
        }
408
410
        if (
409
 
#line 1254 "ifupdown.nw"
 
411
#line 1267 "ifupdown.nw"
410
412
ferror(f) != 0
411
 
#line 1170 "ifupdown.nw"
 
413
#line 1184 "ifupdown.nw"
412
414
                                           ) {
413
415
                
414
 
#line 1913 "ifupdown.nw"
 
416
#line 2008 "ifupdown.nw"
415
417
perror(filename);
416
418
return NULL;
417
 
#line 1172 "ifupdown.nw"
 
419
#line 1186 "ifupdown.nw"
418
420
        }
419
421
 
420
422
        
421
 
#line 1208 "ifupdown.nw"
 
423
#line 1221 "ifupdown.nw"
422
424
fclose(f);
423
425
line = -1;
424
426
 
425
 
#line 1176 "ifupdown.nw"
 
427
#line 1190 "ifupdown.nw"
426
428
        return defn;
427
429
}
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) {
430
432
        
431
 
#line 1292 "ifupdown.nw"
 
433
#line 1305 "ifupdown.nw"
432
434
size_t pos;
433
435
 
434
 
#line 1270 "ifupdown.nw"
 
436
#line 1283 "ifupdown.nw"
435
437
        do {
436
438
                
437
 
#line 1299 "ifupdown.nw"
 
439
#line 1312 "ifupdown.nw"
438
440
pos = 0;
439
 
#line 1272 "ifupdown.nw"
 
441
#line 1285 "ifupdown.nw"
440
442
                
441
 
#line 1310 "ifupdown.nw"
 
443
#line 1323 "ifupdown.nw"
442
444
do {
443
445
        
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;
452
454
}
453
 
#line 1312 "ifupdown.nw"
 
455
#line 1325 "ifupdown.nw"
454
456
        
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;
459
461
}
460
462
pos += strlen(*result + pos);
461
 
#line 1313 "ifupdown.nw"
 
463
#line 1326 "ifupdown.nw"
462
464
} while(
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"
466
468
                                   );
467
469
 
468
 
#line 1372 "ifupdown.nw"
 
470
#line 1385 "ifupdown.nw"
469
471
if (pos != 0 && (*result)[pos-1] == '\n') {
470
472
        (*result)[--pos] = '\0';
471
473
}
472
474
 
473
 
#line 1317 "ifupdown.nw"
 
475
#line 1330 "ifupdown.nw"
474
476
(*line)++;
475
477
 
476
478
assert( (*result)[pos] == '\0' );
477
 
#line 1273 "ifupdown.nw"
 
479
#line 1286 "ifupdown.nw"
478
480
                
479
 
#line 1388 "ifupdown.nw"
 
481
#line 1401 "ifupdown.nw"
480
482
481
483
        int first = 0; 
482
484
        while (isspace((*result)[first]) && (*result)[first]) {
486
488
        memmove(*result, *result + first, pos - first + 1);
487
489
        pos -= first;
488
490
}
489
 
#line 1274 "ifupdown.nw"
 
491
#line 1287 "ifupdown.nw"
490
492
        } while (
491
 
#line 1412 "ifupdown.nw"
 
493
#line 1425 "ifupdown.nw"
492
494
(*result)[0] == '#'
493
 
#line 1274 "ifupdown.nw"
 
495
#line 1287 "ifupdown.nw"
494
496
                               );
495
497
 
496
498
        while (
497
 
#line 1416 "ifupdown.nw"
 
499
#line 1429 "ifupdown.nw"
498
500
(*result)[pos-1] == '\\'
499
 
#line 1276 "ifupdown.nw"
 
501
#line 1289 "ifupdown.nw"
500
502
                               ) {
501
503
                
502
 
#line 1420 "ifupdown.nw"
 
504
#line 1433 "ifupdown.nw"
503
505
(*result)[--pos] = '\0';
504
 
#line 1278 "ifupdown.nw"
 
506
#line 1291 "ifupdown.nw"
505
507
                
506
 
#line 1310 "ifupdown.nw"
 
508
#line 1323 "ifupdown.nw"
507
509
do {
508
510
        
509
 
#line 1331 "ifupdown.nw"
 
511
#line 1344 "ifupdown.nw"
510
512
if (*result_len - pos < 10) {
511
513
        char *newstr = realloc(*result, *result_len * 2 + 80);
512
514
        if (newstr == NULL) {
515
517
        *result = newstr;
516
518
        *result_len = *result_len * 2 + 80;
517
519
}
518
 
#line 1312 "ifupdown.nw"
 
520
#line 1325 "ifupdown.nw"
519
521
        
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;
524
526
}
525
527
pos += strlen(*result + pos);
526
 
#line 1313 "ifupdown.nw"
 
528
#line 1326 "ifupdown.nw"
527
529
} while(
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"
531
533
                                   );
532
534
 
533
 
#line 1372 "ifupdown.nw"
 
535
#line 1385 "ifupdown.nw"
534
536
if (pos != 0 && (*result)[pos-1] == '\n') {
535
537
        (*result)[--pos] = '\0';
536
538
}
537
539
 
538
 
#line 1317 "ifupdown.nw"
 
540
#line 1330 "ifupdown.nw"
539
541
(*line)++;
540
542
 
541
543
assert( (*result)[pos] == '\0' );
542
 
#line 1279 "ifupdown.nw"
 
544
#line 1292 "ifupdown.nw"
543
545
        }
544
546
 
545
547
        
546
 
#line 1400 "ifupdown.nw"
 
548
#line 1413 "ifupdown.nw"
547
549
while (isspace((*result)[pos-1])) { /* remove trailing whitespace */
548
550
        pos--;
549
551
}
550
552
(*result)[pos] = '\0';
551
553
 
552
 
#line 1283 "ifupdown.nw"
 
554
#line 1296 "ifupdown.nw"
553
555
        return 1;
554
556
}
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;
567
569
 
568
570
        return buf;
569
571
}
570
 
#line 1704 "ifupdown.nw"
 
572
#line 1720 "ifupdown.nw"
571
573
static address_family *get_address_family(address_family *af[], char *name) {
572
574
        int i;
573
575
        for (i = 0; af[i]; i++) {
577
579
        }
578
580
        return NULL;
579
581
}
580
 
#line 1735 "ifupdown.nw"
 
582
#line 1751 "ifupdown.nw"
581
583
static method *get_method(address_family *af, char *name) {
582
584
        int i;
583
585
        for (i = 0; i < af->n_methods; i++) {
587
589
        }
588
590
        return NULL;
589
591
}
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;
594
596
        return 1;
595
597
}
 
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;
 
602
        }
 
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;
 
611
        }
 
612
        return *allowups;
 
613
}
 
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;
 
619
        }
 
620
        return allowups;
 
621
}
 
622
#line 1962 "ifupdown.nw"
 
623
allowup_defn *add_allow_up(char *filename, int line,
 
624
        allowup_defn *allow_up, char *iface_name)
 
625
{
 
626
        
 
627
#line 1972 "ifupdown.nw"
 
628
{
 
629
        int i;
 
630
 
 
631
        for (i = 0; i < allow_up->n_interfaces; i++) {
 
632
                if (strcmp(iface_name, allow_up->interfaces[i]) == 0) {
 
633
                        
 
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);
 
637
return NULL;
 
638
#line 1978 "ifupdown.nw"
 
639
                }
 
640
        }
 
641
}
 
642
#line 1966 "ifupdown.nw"
 
643
        
 
644
#line 1984 "ifupdown.nw"
 
645
if (allow_up->n_interfaces == allow_up->max_interfaces) {
 
646
        char **tmp;
 
647
        allow_up->max_interfaces *= 2;
 
648
        allow_up->max_interfaces++;
 
649
        tmp = realloc(allow_up->interfaces, 
 
650
                sizeof(*tmp) * allow_up->max_interfaces);
 
651
        if (tmp == NULL) {
 
652
                
 
653
#line 2008 "ifupdown.nw"
 
654
perror(filename);
 
655
return NULL;
 
656
#line 1992 "ifupdown.nw"
 
657
        }
 
658
        allow_up->interfaces = tmp;
 
659
}
 
660
 
 
661
allow_up->interfaces[allow_up->n_interfaces] = strdup(iface_name);
 
662
allow_up->n_interfaces++;
 
663
#line 1967 "ifupdown.nw"
 
664
        return allow_up;
 
665
}