summaryrefslogtreecommitdiff
path: root/networking/ifupdown.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/ifupdown.c')
-rw-r--r--networking/ifupdown.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index ccebecd..c7cb853 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -1091,6 +1091,7 @@ int ifupdown_main(int argc, char **argv)
llist_t *state_list = NULL;
llist_t *target_list = NULL;
const char *interfaces = "/etc/network/interfaces";
+ FILE *state_fp;
int any_failures = 0;
cmds = iface_down;
@@ -1117,6 +1118,19 @@ int ifupdown_main(int argc, char **argv)
startup_PATH = getenv("PATH");
if (!startup_PATH) startup_PATH = "";
+ /* Read the previous state from the state file */
+ state_fp = fopen_or_warn("/var/run/ifstate", "r");
+ if (state_fp) {
+ char *start, *end_ptr;
+ while ((start = xmalloc_fgets(state_fp)) != NULL) {
+ /* We should only need to check for a single character */
+ end_ptr = start + strcspn(start, " \t\n");
+ *end_ptr = '\0';
+ llist_add_to(&state_list, start);
+ }
+ fclose(state_fp);
+ }
+
/* Create a list of interfaces to work on */
if (DO_ALL) {
if (cmds == iface_up) {
@@ -1166,7 +1180,7 @@ int ifupdown_main(int argc, char **argv)
}
} else {
/* ifdown */
- if (iface_state) {
+ if (!iface_state) {
bb_error_msg("interface %s not configured", iface);
continue;
}
@@ -1236,7 +1250,8 @@ int ifupdown_main(int argc, char **argv)
iface_state->data = newiface;
}
} else {
- /* Remove an interface from the linked list */
+ /* Remove an interface from state_list */
+ llist_unlink(&state_list, iface_state);
free(llist_pop(&iface_state));
}
}
@@ -1244,8 +1259,6 @@ int ifupdown_main(int argc, char **argv)
/* Actually write the new state */
if (!NO_ACT) {
- FILE *state_fp;
-
state_fp = xfopen("/var/run/ifstate", "w");
while (state_list) {
if (state_list->data) {