summaryrefslogtreecommitdiff
path: root/ubus.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-09-05 03:56:10 +0200
committerFelix Fietkau <nbd@openwrt.org>2011-09-05 03:56:10 +0200
commitf5bb1c61228b7900e69eaea0788ee9d5fb304691 (patch)
treedc2d713c7120a23b250081d988f6279504da9bc3 /ubus.c
parent5f739f10e9d7af0eb412102356434f905ed8f467 (diff)
downloadnetifd-f5bb1c61228b7900e69eaea0788ee9d5fb304691.tar.gz
fix the ubus hotplug add/remove interface to properly clean up devices
Diffstat (limited to 'ubus.c')
-rw-r--r--ubus.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/ubus.c b/ubus.c
index 8b9bc3a..2c4e4e6 100644
--- a/ubus.c
+++ b/ubus.c
@@ -207,33 +207,35 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj,
if (!tb[DEV_NAME])
return UBUS_STATUS_INVALID_ARGUMENT;
- dev = device_get(blobmsg_data(tb[DEV_NAME]), add);
- if (!dev)
- return UBUS_STATUS_NOT_FOUND;
-
main_dev = iface->main_dev.dev;
if (!main_dev)
return UBUS_STATUS_NOT_FOUND;
- if (main_dev == dev)
- return UBUS_STATUS_INVALID_ARGUMENT;
-
if (!main_dev->hotplug_ops)
return UBUS_STATUS_NOT_SUPPORTED;
- if (add)
- ret = main_dev->hotplug_ops->add(main_dev, dev);
- else
- ret = main_dev->hotplug_ops->del(main_dev, dev);
+ dev = device_get(blobmsg_data(tb[DEV_NAME]), add);
+ if (!dev)
+ return UBUS_STATUS_NOT_FOUND;
+
+ if (main_dev != dev) {
+ if (add)
+ ret = main_dev->hotplug_ops->add(main_dev, dev);
+ else
+ ret = main_dev->hotplug_ops->del(main_dev, dev);
+ if (ret)
+ ret = UBUS_STATUS_UNKNOWN_ERROR;
+ } else {
+ ret = UBUS_STATUS_INVALID_ARGUMENT;
+ }
- if (ret)
- return UBUS_STATUS_UNKNOWN_ERROR;
+ if (add)
+ device_free_unused(dev);
- return 0;
+ return ret;
}
-
static struct ubus_method iface_object_methods[] = {
{ .name = "up", .handler = netifd_handle_up },
{ .name = "down", .handler = netifd_handle_down },