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;