svn commit: trunk/busybox: include libbb networking
vda at busybox.net
vda at busybox.net
Tue Mar 6 22:53:11 UTC 2007
Author: vda
Date: 2007-03-06 14:53:10 -0800 (Tue, 06 Mar 2007)
New Revision: 18018
Log:
ifupdown: code to deconstruct the state_list gracefully
(patch by Gabriel L. Somlo <somlo at cmu.edu>)
Modified:
trunk/busybox/include/libbb.h
trunk/busybox/libbb/llist.c
trunk/busybox/networking/ifupdown.c
Changeset:
Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h 2007-03-06 19:13:31 UTC (rev 18017)
+++ trunk/busybox/include/libbb.h 2007-03-06 22:53:10 UTC (rev 18018)
@@ -475,6 +475,7 @@
extern void llist_add_to(llist_t **old_head, void *data);
extern void llist_add_to_end(llist_t **list_head, void *data);
extern void *llist_pop(llist_t **elm);
+extern void llist_unlink(llist_t **head, llist_t *elm);
extern void llist_free(llist_t *elm, void (*freeit)(void *data));
extern llist_t* llist_rev(llist_t *list);
Modified: trunk/busybox/libbb/llist.c
===================================================================
--- trunk/busybox/libbb/llist.c 2007-03-06 19:13:31 UTC (rev 18017)
+++ trunk/busybox/libbb/llist.c 2007-03-06 22:53:10 UTC (rev 18018)
@@ -45,21 +45,40 @@
/* Remove first element from the list and return it */
void *llist_pop(llist_t ** head)
{
- void *data;
+ void *data, *next;
if (!*head)
- data = *head;
- else {
- void *next = (*head)->link;
+ return NULL;
- data = (*head)->data;
- free(*head);
- *head = next;
- }
+ data = (*head)->data;
+ next = (*head)->link;
+ free(*head);
+ *head = next;
return data;
}
+/* Unlink arbitrary given element from the list */
+void llist_unlink(llist_t **head, llist_t *elm)
+{
+ llist_t *crt;
+
+ if (!(elm && *head))
+ return;
+
+ if (elm == *head) {
+ *head = (*head)->link;
+ return;
+ }
+
+ for (crt = *head; crt; crt = crt->link) {
+ if (crt->link == elm) {
+ crt->link = elm->link;
+ return;
+ }
+ }
+}
+
/* Recursively free all elements in the linked list. If freeit != NULL
* call it on each datum in the list */
void llist_free(llist_t * elm, void (*freeit) (void *data))
Modified: trunk/busybox/networking/ifupdown.c
===================================================================
--- trunk/busybox/networking/ifupdown.c 2007-03-06 19:13:31 UTC (rev 18017)
+++ trunk/busybox/networking/ifupdown.c 2007-03-06 22:53:10 UTC (rev 18018)
@@ -1091,6 +1091,7 @@
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 @@
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 @@
}
} else {
/* ifdown */
- if (iface_state) {
+ if (!iface_state) {
bb_error_msg("interface %s not configured", iface);
continue;
}
@@ -1236,7 +1250,8 @@
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 @@
/* 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) {
More information about the busybox-cvs
mailing list