summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-04-05 03:52:39 +0200
committerFelix Fietkau <nbd@openwrt.org>2011-04-05 03:52:39 +0200
commitd3a4844047c7b3c62511a9836a81703b5ee70fc0 (patch)
treecd25491c58cbba0bebd5f0f17ce155d668528544
parentb18fb36bd3c7615733c351c99691e1139f386c0c (diff)
add code for cleaning up unused devices mentioned in the config
-rw-r--r--config.c1
-rw-r--r--config/network3
-rw-r--r--device.c13
-rw-r--r--device.h2
4 files changed, 19 insertions, 0 deletions
diff --git a/config.c b/config.c
index 6019862..1711121 100644
--- a/config.c
+++ b/config.c
@@ -180,6 +180,7 @@ config_init_interfaces(const char *name)
if (!strcmp(s->type, "interface"))
config_parse_interface(s);
}
+ cleanup_devices();
config_init = false;
start_pending_interfaces();
diff --git a/config/network b/config/network
index 00c5b51..0a02e89 100644
--- a/config/network
+++ b/config/network
@@ -12,6 +12,9 @@ config device
option ifname "eth0.1 eth0.2"
option mtu 1500
+config device
+ option name dummy
+
config interface lan
option ifname 'br-lan'
option proto static
diff --git a/device.c b/device.c
index 57b0ac9..34b49d4 100644
--- a/device.c
+++ b/device.c
@@ -197,3 +197,16 @@ void remove_device_user(struct device_user *dep)
dep->dev = NULL;
}
+
+void
+cleanup_devices(void)
+{
+ struct device *dev, *tmp;
+
+ avl_for_each_element_safe(&devices, dev, avl, tmp) {
+ if (!list_empty(&dev->users))
+ continue;
+
+ free_device(dev);
+ }
+}
diff --git a/device.h b/device.h
index 79aec32..bbb78d8 100644
--- a/device.h
+++ b/device.h
@@ -100,6 +100,8 @@ int claim_device(struct device *dev);
void release_device(struct device *dev);
int check_device_state(struct device *dev);
+void cleanup_devices(void);
+
struct device *get_vlan_device_chain(const char *ifname, bool create);
struct device *bridge_create(const char *name, struct uci_section *s);