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

« back to all changes in this revision

Viewing changes to execute.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 1980 "ifupdown.nw"
 
1
#line 2076 "ifupdown.nw"
2
2
#include <stdio.h>
3
3
#include <ctype.h>
4
4
#include <stdlib.h>
6
6
#include <assert.h>
7
7
 
8
8
#include "header.h"
9
 
#line 2577 "ifupdown.nw"
 
9
#line 2698 "ifupdown.nw"
10
10
#include <errno.h>
11
 
#line 2763 "ifupdown.nw"
 
11
#line 2884 "ifupdown.nw"
12
12
#include <stdarg.h>
13
 
#line 2786 "ifupdown.nw"
 
13
#line 2907 "ifupdown.nw"
14
14
#include <unistd.h>
15
15
#include <sys/wait.h>
16
 
#line 2064 "ifupdown.nw"
 
16
#line 2160 "ifupdown.nw"
17
17
static char **environ = NULL;
18
 
#line 2041 "ifupdown.nw"
 
18
#line 2137 "ifupdown.nw"
19
19
static int check(char *str);
20
 
#line 2071 "ifupdown.nw"
21
 
static void set_environ(interface_defn *iface, char *mode);
22
 
#line 2147 "ifupdown.nw"
 
20
#line 2167 "ifupdown.nw"
 
21
static void set_environ(interface_defn *iface, char *mode, char *phase);
 
22
#line 2245 "ifupdown.nw"
23
23
static char *setlocalenv(char *format, char *name, char *value);
24
 
#line 2245 "ifupdown.nw"
 
24
#line 2358 "ifupdown.nw"
25
25
static int doit(char *str);
26
 
#line 2404 "ifupdown.nw"
 
26
#line 2525 "ifupdown.nw"
27
27
static char *parse(char *command, interface_defn *ifd);
28
 
#line 2451 "ifupdown.nw"
 
28
#line 2572 "ifupdown.nw"
29
29
void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t strlen);
30
 
#line 2658 "ifupdown.nw"
 
30
#line 2779 "ifupdown.nw"
31
31
int strncmpz(char *l, char *r, size_t llen);
32
 
#line 2675 "ifupdown.nw"
 
32
#line 2796 "ifupdown.nw"
33
33
char *get_var(char *id, size_t idlen, interface_defn *ifd);
34
 
#line 2767 "ifupdown.nw"
 
34
#line 2888 "ifupdown.nw"
35
35
static int popen2(FILE **in, FILE **out, char *command, ...);
36
 
#line 2045 "ifupdown.nw"
 
36
#line 2141 "ifupdown.nw"
37
37
static int check(char *str) {
38
38
        return str != NULL;
39
39
}
40
 
#line 2077 "ifupdown.nw"
41
 
static void set_environ(interface_defn *iface, char *mode) {
 
40
#line 2173 "ifupdown.nw"
 
41
static void set_environ(interface_defn *iface, char *mode, char *phase) {
42
42
        
43
 
#line 2102 "ifupdown.nw"
 
43
#line 2202 "ifupdown.nw"
44
44
char **environend;
45
 
#line 2079 "ifupdown.nw"
 
45
#line 2175 "ifupdown.nw"
46
46
        int i;
47
 
        const int n_env_entries = iface->n_options + 5;
 
47
        const int n_env_entries = iface->n_options + 8;
48
48
 
49
49
        
50
 
#line 2115 "ifupdown.nw"
51
 
{
 
50
#line 2215 "ifupdown.nw"
 
51
if (environ != NULL) {
52
52
        char **ppch;
53
 
        if (environ != NULL) {
54
 
                for (ppch = environ; *ppch; ppch++) {
55
 
                        free(*ppch);
56
 
                        *ppch = NULL;
57
 
                }
58
 
                free(environ);
59
 
                environ = NULL;
 
53
        for (ppch = environ; *ppch; ppch++) {
 
54
                free(*ppch);
 
55
                *ppch = NULL;
60
56
        }
 
57
        free(environ);
 
58
        environ = NULL;
61
59
}
62
 
#line 2109 "ifupdown.nw"
 
60
#line 2209 "ifupdown.nw"
63
61
environ = malloc(sizeof(char*) * (n_env_entries + 1 /* for final NULL */));
64
62
environend = environ; 
65
63
*environend = NULL;
66
64
 
67
 
#line 2084 "ifupdown.nw"
 
65
#line 2180 "ifupdown.nw"
68
66
        for (i = 0; i < iface->n_options; i++) {
69
67
                
70
 
#line 2131 "ifupdown.nw"
71
 
if (strcmp(iface->option[i].name, "up") == 0
 
68
#line 2229 "ifupdown.nw"
 
69
if (strcmp(iface->option[i].name, "pre-up") == 0
 
70
    || strcmp(iface->option[i].name, "up") == 0
72
71
    || strcmp(iface->option[i].name, "down") == 0
73
 
    || strcmp(iface->option[i].name, "pre-up") == 0
74
72
    || strcmp(iface->option[i].name, "post-down") == 0)
75
73
{
76
74
        continue;
77
75
}
78
76
 
79
 
#line 2087 "ifupdown.nw"
 
77
#line 2183 "ifupdown.nw"
80
78
                
81
 
#line 2153 "ifupdown.nw"
 
79
#line 2251 "ifupdown.nw"
82
80
*(environend++) = setlocalenv("IF_%s=%s", iface->option[i].name,
83
81
                              iface->option[i].value);
84
82
*environend = NULL;
85
 
#line 2088 "ifupdown.nw"
 
83
#line 2184 "ifupdown.nw"
86
84
        }
87
85
 
88
86
        
89
 
#line 2159 "ifupdown.nw"
90
 
*(environend++) = setlocalenv("%s=%s", "IFACE", iface->iface);
91
 
*environend = NULL;
92
 
#line 2091 "ifupdown.nw"
93
 
        
94
 
#line 2174 "ifupdown.nw"
 
87
#line 2257 "ifupdown.nw"
 
88
*(environend++) = setlocalenv("%s=%s", "IFACE", iface->real_iface);
 
89
*environend = NULL;
 
90
#line 2187 "ifupdown.nw"
 
91
        
 
92
#line 2262 "ifupdown.nw"
 
93
*(environend++) = setlocalenv("%s=%s", "LOGICAL", iface->logical_iface);
 
94
*environend = NULL;
 
95
#line 2188 "ifupdown.nw"
 
96
        
 
97
#line 2287 "ifupdown.nw"
95
98
*(environend++) = setlocalenv("%s=%s", "ADDRFAM", iface->address_family->name);
96
99
*environend = NULL;
97
 
#line 2092 "ifupdown.nw"
 
100
#line 2189 "ifupdown.nw"
98
101
        
99
 
#line 2179 "ifupdown.nw"
 
102
#line 2292 "ifupdown.nw"
100
103
*(environend++) = setlocalenv("%s=%s", "METHOD", iface->method->name);
101
104
*environend = NULL;
102
 
#line 2093 "ifupdown.nw"
 
105
 
 
106
#line 2191 "ifupdown.nw"
103
107
        
104
 
#line 2164 "ifupdown.nw"
 
108
#line 2267 "ifupdown.nw"
105
109
*(environend++) = setlocalenv("%s=%s", "MODE", mode);
106
110
*environend = NULL;
107
 
#line 2094 "ifupdown.nw"
108
 
        
109
 
#line 2169 "ifupdown.nw"
 
111
#line 2192 "ifupdown.nw"
 
112
        
 
113
#line 2272 "ifupdown.nw"
 
114
*(environend++) = setlocalenv("%s=%s", "PHASE", phase); 
 
115
*environend = NULL;
 
116
#line 2193 "ifupdown.nw"
 
117
        
 
118
#line 2282 "ifupdown.nw"
 
119
*(environend++) = setlocalenv("%s=%s", "VERBOSITY", verbose ? "1" : "0");
 
120
*environend = NULL;
 
121
#line 2194 "ifupdown.nw"
 
122
        
 
123
#line 2277 "ifupdown.nw"
110
124
*(environend++) = setlocalenv("%s=%s", "PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
111
125
*environend = NULL;
112
 
#line 2095 "ifupdown.nw"
 
126
#line 2195 "ifupdown.nw"
113
127
}
114
 
#line 2186 "ifupdown.nw"
 
128
#line 2299 "ifupdown.nw"
115
129
static char *setlocalenv(char *format, char *name, char *value) {
116
130
        char *result;
117
131
 
118
132
        
119
 
#line 2204 "ifupdown.nw"
 
133
#line 2317 "ifupdown.nw"
120
134
result = malloc(strlen(format)   /* -4 for the two %s's */
121
135
                + strlen(name) 
122
136
                + strlen(value) 
126
140
        exit(1);
127
141
}
128
142
 
129
 
#line 2191 "ifupdown.nw"
 
143
#line 2304 "ifupdown.nw"
130
144
        sprintf(result, format, name, value);
131
145
 
132
146
        
133
 
#line 2220 "ifupdown.nw"
 
147
#line 2333 "ifupdown.nw"
134
148
{
135
149
        char *here, *there;
136
150
 
146
160
        memmove(here, there, strlen(there) + 1);
147
161
}
148
162
 
149
 
#line 2195 "ifupdown.nw"
 
163
#line 2308 "ifupdown.nw"
150
164
        return result;
151
165
}
152
 
#line 2249 "ifupdown.nw"
 
166
#line 2362 "ifupdown.nw"
153
167
static int doit(char *str) {
154
168
        assert(str);
155
169
 
176
190
        }
177
191
        return 1;
178
192
}
179
 
#line 2295 "ifupdown.nw"
 
193
#line 2408 "ifupdown.nw"
180
194
int execute_all(interface_defn *ifd, execfn *exec, char *opt) {
181
195
        int i;
182
196
        char buf[100];
188
202
                }
189
203
        }
190
204
 
191
 
        sprintf(buf, "run-parts /etc/network/if-%s.d", opt);
 
205
        snprintf(buf, sizeof(buf), "run-parts %s /etc/network/if-%s.d",
 
206
                verbose ? "--verbose" : "", opt);
 
207
 
192
208
        (*exec)(buf); 
193
209
 
194
210
        return 1;
195
211
}
196
 
#line 2323 "ifupdown.nw"
 
212
#line 2438 "ifupdown.nw"
197
213
int iface_up(interface_defn *iface) {
198
214
        if (!iface->method->up(iface,check)) return -1;
199
215
 
200
 
        set_environ(iface, "start");
 
216
        set_environ(iface, "start", "pre-up");
201
217
        if (!execute_all(iface,doit,"pre-up")) return 0;
 
218
 
202
219
        if (!iface->method->up(iface,doit)) return 0;
 
220
 
 
221
        set_environ(iface, "start", "post-up");
203
222
        if (!execute_all(iface,doit,"up")) return 0;
204
223
 
205
224
        return 1;
206
225
}
207
 
#line 2336 "ifupdown.nw"
 
226
#line 2454 "ifupdown.nw"
208
227
int iface_down(interface_defn *iface) {
209
228
        if (!iface->method->down(iface,check)) return -1;
210
229
 
211
 
        set_environ(iface, "stop");
 
230
        set_environ(iface, "stop", "pre-down");
212
231
        if (!execute_all(iface,doit,"down")) return 0;
 
232
 
213
233
        if (!iface->method->down(iface,doit)) return 0;
 
234
 
 
235
        set_environ(iface, "stop", "post-down");
214
236
        if (!execute_all(iface,doit,"post-down")) return 0;
215
237
 
216
238
        return 1;
217
239
}
218
 
#line 2362 "ifupdown.nw"
 
240
#line 2483 "ifupdown.nw"
219
241
int execute(char *command, interface_defn *ifd, execfn *exec) { 
220
242
        char *out;
221
243
        int ret;
228
250
        free(out);
229
251
        return ret;
230
252
}
231
 
#line 2408 "ifupdown.nw"
 
253
#line 2529 "ifupdown.nw"
232
254
static char *parse(char *command, interface_defn *ifd) {
233
255
        
234
 
#line 2433 "ifupdown.nw"
 
256
#line 2554 "ifupdown.nw"
235
257
char *result = NULL;
236
258
size_t pos = 0, len = 0;
237
 
#line 2527 "ifupdown.nw"
 
259
#line 2648 "ifupdown.nw"
238
260
size_t old_pos[MAX_OPT_DEPTH] = {0};
239
261
int okay[MAX_OPT_DEPTH] = {1};
240
262
int opt_depth = 1;
241
263
 
242
 
#line 2411 "ifupdown.nw"
 
264
#line 2532 "ifupdown.nw"
243
265
        while(*command) {
244
266
                switch(*command) {
245
267
                        
246
 
#line 2481 "ifupdown.nw"
 
268
#line 2602 "ifupdown.nw"
247
269
default:
248
270
        addstr(&result, &len, &pos, command, 1);
249
271
        command++;
250
272
        break;
251
 
#line 2494 "ifupdown.nw"
 
273
#line 2615 "ifupdown.nw"
252
274
case '\\':
253
275
        if (command[1]) {
254
276
                addstr(&result, &len, &pos, command+1, 1);
258
280
                command++;
259
281
        }
260
282
        break;
261
 
#line 2542 "ifupdown.nw"
 
283
#line 2663 "ifupdown.nw"
262
284
case '[':
263
285
        if (command[1] == '[' && opt_depth < MAX_OPT_DEPTH) {
264
286
                old_pos[opt_depth] = pos;
270
292
                command++;
271
293
        }
272
294
        break;
273
 
#line 2556 "ifupdown.nw"
 
295
#line 2677 "ifupdown.nw"
274
296
case ']':
275
297
        if (command[1] == ']' && opt_depth > 1) {
276
298
                opt_depth--;
284
306
                command++;
285
307
        }
286
308
        break;
287
 
#line 2611 "ifupdown.nw"
 
309
#line 2732 "ifupdown.nw"
288
310
case '%':
289
311
{
290
312
        
291
 
#line 2636 "ifupdown.nw"
 
313
#line 2757 "ifupdown.nw"
292
314
char *nextpercent;
293
 
#line 2614 "ifupdown.nw"
 
315
#line 2735 "ifupdown.nw"
294
316
        char *varvalue;
295
317
 
296
318
        
297
 
#line 2640 "ifupdown.nw"
 
319
#line 2761 "ifupdown.nw"
298
320
command++;
299
321
nextpercent = strchr(command, '%');
300
322
if (!nextpercent) {
303
325
        return NULL;
304
326
}
305
327
 
306
 
#line 2618 "ifupdown.nw"
 
328
#line 2739 "ifupdown.nw"
307
329
        
308
 
#line 2699 "ifupdown.nw"
 
330
#line 2820 "ifupdown.nw"
309
331
varvalue = get_var(command, nextpercent - command, ifd);
310
332
 
311
 
#line 2620 "ifupdown.nw"
 
333
#line 2741 "ifupdown.nw"
312
334
        if (varvalue) {
313
335
                addstr(&result, &len, &pos, varvalue, strlen(varvalue));
314
336
        } else {
316
338
        }
317
339
 
318
340
        
319
 
#line 2650 "ifupdown.nw"
 
341
#line 2771 "ifupdown.nw"
320
342
command = nextpercent + 1;
321
343
 
322
 
#line 2628 "ifupdown.nw"
 
344
#line 2749 "ifupdown.nw"
323
345
        break;
324
346
}
325
 
#line 2414 "ifupdown.nw"
 
347
#line 2535 "ifupdown.nw"
326
348
                }
327
349
        }
328
350
 
329
351
        
330
 
#line 2586 "ifupdown.nw"
 
352
#line 2707 "ifupdown.nw"
331
353
if (opt_depth > 1) {
332
354
        errno = EUNBALBRACK;
333
355
        free(result);
340
362
        return NULL;
341
363
}
342
364
 
343
 
#line 2419 "ifupdown.nw"
 
365
#line 2540 "ifupdown.nw"
344
366
        
345
 
#line 2440 "ifupdown.nw"
 
367
#line 2561 "ifupdown.nw"
346
368
return result;
347
 
#line 2420 "ifupdown.nw"
 
369
#line 2541 "ifupdown.nw"
348
370
}
349
 
#line 2455 "ifupdown.nw"
 
371
#line 2576 "ifupdown.nw"
350
372
void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t strlen) {
351
373
        assert(*len >= *pos);
352
374
        assert(*len == 0 || (*buf)[*pos] == '\0');
368
390
        }
369
391
        (*buf)[*pos] = '\0';
370
392
}
371
 
#line 2662 "ifupdown.nw"
 
393
#line 2783 "ifupdown.nw"
372
394
int strncmpz(char *l, char *r, size_t llen) {
373
395
        int i = strncmp(l, r, llen);
374
396
        if (i == 0)
376
398
        else
377
399
                return i;
378
400
}
379
 
#line 2679 "ifupdown.nw"
 
401
#line 2800 "ifupdown.nw"
380
402
char *get_var(char *id, size_t idlen, interface_defn *ifd) {
381
403
        int i;
382
404
 
383
405
        if (strncmpz(id, "iface", idlen) == 0) {
384
 
                return ifd->iface;
 
406
                return ifd->real_iface;
385
407
        } else {
386
408
                for (i = 0; i < ifd->n_options; i++) {
387
409
                        if (strncmpz(id, ifd->option[i].name, idlen) == 0) {
392
414
 
393
415
        return NULL;
394
416
}
395
 
#line 2718 "ifupdown.nw"
 
417
#line 2839 "ifupdown.nw"
396
418
int run_mapping(char *physical, char *logical, int len, mapping_defn *map) {
397
419
        FILE *in, *out;
398
420
        int i, status;
399
421
        pid_t pid;
400
422
 
401
423
        
402
 
#line 2777 "ifupdown.nw"
 
424
#line 2898 "ifupdown.nw"
403
425
pid = popen2(&in, &out, map->script, physical, NULL);
404
426
if (pid == 0) {
405
427
        return 0;
406
428
}
407
 
#line 2724 "ifupdown.nw"
 
429
#line 2845 "ifupdown.nw"
408
430
        
409
 
#line 2736 "ifupdown.nw"
 
431
#line 2857 "ifupdown.nw"
410
432
for (i = 0; i < map->n_mappings; i++) {
411
433
        fprintf(in, "%s\n", map->mapping[i]);
412
434
}
413
435
fclose(in);
414
 
#line 2725 "ifupdown.nw"
 
436
#line 2846 "ifupdown.nw"
415
437
        
416
 
#line 2743 "ifupdown.nw"
 
438
#line 2864 "ifupdown.nw"
417
439
waitpid(pid, &status, 0);
418
 
#line 2726 "ifupdown.nw"
 
440
#line 2847 "ifupdown.nw"
419
441
        
420
 
#line 2747 "ifupdown.nw"
 
442
#line 2868 "ifupdown.nw"
421
443
if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
422
444
        if (fgets(logical, len, out)) {
423
445
                char *pch = logical + strlen(logical) - 1;
427
449
}
428
450
fclose(out);    
429
451
 
430
 
#line 2728 "ifupdown.nw"
 
452
#line 2849 "ifupdown.nw"
431
453
        return 1;
432
454
}
433
 
#line 2791 "ifupdown.nw"
 
455
#line 2912 "ifupdown.nw"
434
456
static int popen2(FILE **in, FILE **out, char *command, ...) {
435
457
        va_list ap;
436
458
        char *argv[11] = {command};