diff --git a/dongle.c b/dongle.c
index 24717aa855e89103b9a36f05b479c9826979e820..0ca5b30c7aa79c11984622ff0f5ae77e872b3b82 100644
--- a/dongle.c
+++ b/dongle.c
@@ -104,57 +104,72 @@ int tag_missing_devices(void)
return 0;
}
-int add_device(struct device *new_dev)
+int update_device(struct device *dev)
{
- struct device *dev;
+ struct device *prev_dev;
int rv;
- dev = search_list(new_dev->usb.if_name);
- if (dev) {
- if (dev->ip)
- free(dev->ip);
+ prev_dev = search_list(dev->usb.if_name);
+ if (prev_dev) {
+ if (prev_dev->ip)
+ free(prev_dev->ip);
- if (new_dev->ip)
- dev->ip = strdup(new_dev->ip);
+ if (dev->ip)
+ prev_dev->ip = strdup(dev->ip);
else
- dev->ip = NULL;
+ prev_dev->ip = NULL;
- if (!dev->ubus_obj && dev->ip) {
- dev->ubus_obj = dongle_create_dynamic_object(dev);
- if (!dev->ubus_obj)
+ if (!prev_dev->ubus_obj && prev_dev->ip) {
+ prev_dev->ubus_obj = dongle_create_dynamic_object(prev_dev);
+ if (!prev_dev->ubus_obj)
goto fail;
- rv = publish_ubus_object(global_ctx, dev->ubus_obj);
+ rv = publish_ubus_object(global_ctx, prev_dev->ubus_obj);
if (rv)
goto fail;
- global_dev= dev;
+ global_dev = prev_dev;
- } else if (dev->ubus_obj && !dev->ip) {
- unpublish_ubus_object(global_ctx, dev->ubus_obj);
- dongle_destroy_dynamic_object(&(dev->ubus_obj));
+ } else if (prev_dev->ubus_obj && !prev_dev->ip) {
+ unpublish_ubus_object(global_ctx, prev_dev->ubus_obj);
+ dongle_destroy_dynamic_object(&(prev_dev->ubus_obj));
}
- dev->present = true;
+ prev_dev->present = true;
+
+ delete_device(dev);
+ } else
+ goto not_present;
- delete_device(new_dev);
+ return 0;
+not_present:
+ return -1;
+fail:
+ return -2;
+}
+
+int add_device(struct device *dev)
+{
+ int rv;
+
+ rv = update_device(dev);
+ if (rv == 0)
goto already_present;
- }
- new_dev->present = true;
+ dev->present = true;
if (list_empty(&devices))
INIT_LIST_HEAD(&devices);
- list_add_tail(&new_dev->list, &devices);
- if (new_dev->ip) {
- new_dev->ubus_obj = dongle_create_dynamic_object(new_dev);
- if (!new_dev->ubus_obj)
+ list_add_tail(&dev->list, &devices);
+ if (dev->ip) {
+ dev->ubus_obj = dongle_create_dynamic_object(dev);
+ if (!dev->ubus_obj)
goto fail;
- rv = publish_ubus_object(global_ctx, new_dev->ubus_obj);
+ rv = publish_ubus_object(global_ctx, dev->ubus_obj);
if (rv)
goto fail;
- global_dev = new_dev;
+ global_dev = dev;
}
return 0;