diff --git a/dongle.c b/dongle.c index 233f2366a1d27ca7ae74d62998d3854dfc9a5217..00ee59aec29855b17f99c1cf95fb4433a10e4e79 100644 --- a/dongle.c +++ b/dongle.c @@ -138,7 +138,6 @@ int update_device(struct device *dev) } prev_dev->present = true; - delete_device(dev); return 0; not_present: return -1; @@ -155,10 +154,11 @@ int add_device(struct device *dev) goto already_present; dev->present = true; + if (list_empty(&devices)) INIT_LIST_HEAD(&devices); - list_add_tail(&dev->list, &devices); + if (dev->ip) { dev->ubus_obj = dongle_create_dynamic_object(dev); if (!dev->ubus_obj) @@ -166,7 +166,7 @@ int add_device(struct device *dev) rv = publish_ubus_object(global_ctx, dev->ubus_obj); if (rv) - goto fail; + goto fail_publish; global_dev = dev; } @@ -174,6 +174,8 @@ int add_device(struct device *dev) return 0; already_present: return -1; +fail_publish: + dongle_destroy_dynamic_object(dev->ubus_obj); fail: return -2; } @@ -453,7 +455,10 @@ int get_devices_from_path(char *input_path) dev->usb.if_name = name; dev->ip = get_device_ip(dev->usb.if_name); - add_device(dev); + rv = add_device(dev); + if (rv < 0) + delete_device(dev); + break; } closedir(dir);