9
#line 2577 "ifupdown.nw"
9
#line 2698 "ifupdown.nw"
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;
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) {
43
#line 2102 "ifupdown.nw"
43
#line 2202 "ifupdown.nw"
45
#line 2079 "ifupdown.nw"
45
#line 2175 "ifupdown.nw"
47
const int n_env_entries = iface->n_options + 5;
47
const int n_env_entries = iface->n_options + 8;
50
#line 2115 "ifupdown.nw"
50
#line 2215 "ifupdown.nw"
51
if (environ != NULL) {
53
if (environ != NULL) {
54
for (ppch = environ; *ppch; ppch++) {
53
for (ppch = environ; *ppch; ppch++) {
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;
67
#line 2084 "ifupdown.nw"
65
#line 2180 "ifupdown.nw"
68
66
for (i = 0; i < iface->n_options; i++) {
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)
79
#line 2087 "ifupdown.nw"
77
#line 2183 "ifupdown.nw"
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"
89
#line 2159 "ifupdown.nw"
90
*(environend++) = setlocalenv("%s=%s", "IFACE", iface->iface);
92
#line 2091 "ifupdown.nw"
94
#line 2174 "ifupdown.nw"
87
#line 2257 "ifupdown.nw"
88
*(environend++) = setlocalenv("%s=%s", "IFACE", iface->real_iface);
90
#line 2187 "ifupdown.nw"
92
#line 2262 "ifupdown.nw"
93
*(environend++) = setlocalenv("%s=%s", "LOGICAL", iface->logical_iface);
95
#line 2188 "ifupdown.nw"
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"
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"
106
#line 2191 "ifupdown.nw"
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"
109
#line 2169 "ifupdown.nw"
111
#line 2192 "ifupdown.nw"
113
#line 2272 "ifupdown.nw"
114
*(environend++) = setlocalenv("%s=%s", "PHASE", phase);
116
#line 2193 "ifupdown.nw"
118
#line 2282 "ifupdown.nw"
119
*(environend++) = setlocalenv("%s=%s", "VERBOSITY", verbose ? "1" : "0");
121
#line 2194 "ifupdown.nw"
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"
114
#line 2186 "ifupdown.nw"
128
#line 2299 "ifupdown.nw"
115
129
static char *setlocalenv(char *format, char *name, char *value) {
119
#line 2204 "ifupdown.nw"
133
#line 2317 "ifupdown.nw"
120
134
result = malloc(strlen(format) /* -4 for the two %s's */
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);
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;
200
set_environ(iface, "start");
216
set_environ(iface, "start", "pre-up");
201
217
if (!execute_all(iface,doit,"pre-up")) return 0;
202
219
if (!iface->method->up(iface,doit)) return 0;
221
set_environ(iface, "start", "post-up");
203
222
if (!execute_all(iface,doit,"up")) return 0;
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;
211
set_environ(iface, "stop");
230
set_environ(iface, "stop", "pre-down");
212
231
if (!execute_all(iface,doit,"down")) return 0;
213
233
if (!iface->method->down(iface,doit)) return 0;
235
set_environ(iface, "stop", "post-down");
214
236
if (!execute_all(iface,doit,"post-down")) return 0;
218
#line 2362 "ifupdown.nw"
240
#line 2483 "ifupdown.nw"
219
241
int execute(char *command, interface_defn *ifd, execfn *exec) {
395
#line 2718 "ifupdown.nw"
417
#line 2839 "ifupdown.nw"
396
418
int run_mapping(char *physical, char *logical, int len, mapping_defn *map) {
402
#line 2777 "ifupdown.nw"
424
#line 2898 "ifupdown.nw"
403
425
pid = popen2(&in, &out, map->script, physical, NULL);
407
#line 2724 "ifupdown.nw"
429
#line 2845 "ifupdown.nw"
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]);
414
#line 2725 "ifupdown.nw"
436
#line 2846 "ifupdown.nw"
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"
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;