add a function for adding a virtual device (not tracked in the avl tree)
authorFelix Fietkau <nbd@openwrt.org>
Sun, 27 Mar 2011 16:40:01 +0000 (18:40 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 27 Mar 2011 16:40:01 +0000 (18:40 +0200)
device.c
device.h

index e1ffba1..f9cb058 100644 (file)
--- a/device.c
+++ b/device.c
@@ -85,29 +85,36 @@ int check_device_state(struct device *dev)
        return dev->type->check_state(dev);
 }
 
-int init_device(struct device *dev, const struct device_type *type, const char *ifname)
+void init_virtual_device(struct device *dev, const struct device_type *type, const char *name)
 {
-       int ret;
-
        assert(dev);
        assert(type);
 
-       if (ifname)
-               strncpy(dev->ifname, ifname, IFNAMSIZ);
+       fprintf(stderr, "Initialize interface '%s'\n", dev->ifname);
+       INIT_LIST_HEAD(&dev->users);
+       dev->type = type;
+
+       if (name)
+               strncpy(dev->ifname, name, IFNAMSIZ);
+}
+
+int init_device(struct device *dev, const struct device_type *type, const char *ifname)
+{
+       int ret;
+
+       init_virtual_device(dev, type, ifname);
 
        if (!dev->set_state)
                dev->set_state = set_device_state;
 
-       fprintf(stderr, "Initialize interface '%s'\n", dev->ifname);
-       INIT_LIST_HEAD(&dev->users);
        dev->avl.key = dev->ifname;
-       dev->type = type;
 
        ret = avl_insert(&devices, &dev->avl);
        if (ret < 0)
                return ret;
 
        check_device_state(dev);
+
        return 0;
 }
 
@@ -149,7 +156,8 @@ void cleanup_device(struct device *dev)
                dep->cb(dep, DEV_EVENT_REMOVE);
        }
 
-       avl_delete(&devices, &dev->avl);
+       if (dev->avl.key)
+               avl_delete(&devices, &dev->avl);
 }
 
 void set_device_present(struct device *dev, bool state)
index 9e7d309..bf93ebc 100644 (file)
--- a/device.h
+++ b/device.h
@@ -79,6 +79,7 @@ struct device_hotplug_ops {
        int (*del)(struct device *main, struct device *member);
 };
 
+void init_virtual_device(struct device *dev, const struct device_type *type, const char *name);
 int init_device(struct device *iface, const struct device_type *type, const char *ifname);
 void cleanup_device(struct device *iface);
 struct device *get_device(const char *name, bool create);