diff --git a/dongle.c b/dongle.c index f2d63286332dfdc7b2a80baf1d2e71d345fced9a..c4d9b9a30fdf0c9896afca559ef3d6f50a639f52 100644 --- a/dongle.c +++ b/dongle.c @@ -90,8 +90,11 @@ int tag_missing_devices(void) } dev->missing++; - if (dev->missing == 1) + if (dev->missing == 1) { + /* TEMPORARY FIX -- TODO: HOW TO CHECK IF IT CONTAINS ELEMENT */ + list_del(&dev->list); delete_device(dev); + } } return 0; @@ -100,34 +103,35 @@ int tag_missing_devices(void) int add_device(struct device *new_dev) { struct device *dev; - dev = search_list(new_dev->usb.if_name); if (dev) { if (dev->ip) free(dev->ip); - dev->ip = new_dev->ip; - - if (!dev->ubus_obj && dev->ip) - dev->ubus_obj = dongle_create_dynamic_object(new_dev); - else if (dev->ubus_obj && !dev->ip) { + if (new_dev->ip) + dev->ip = strdup(new_dev->ip); + else + dev->ip = NULL; + if (!dev->ubus_obj && dev->ip) { + dev->ubus_obj = dongle_create_dynamic_object(dev); + if (dev->ubus_obj) + publish_ubus_object(global_ctx, dev->ubus_obj); + } else if (dev->ubus_obj && !dev->ip) { unpublish_ubus_object(global_ctx, dev->ubus_obj); dongle_destroy_dynamic_object(dev->ubus_obj); } dev->present = true; + delete_device(new_dev); goto already_present; } - new_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) publish_ubus_object(global_ctx, new_dev->ubus_obj); } - return 0; already_present: return -1; @@ -138,6 +142,8 @@ int delete_all_devices(void) struct device *dev, *tmp; list_for_each_entry_safe(dev, tmp, &devices, list) { + /* TEMPORARY FIX -- TODO: HOW TO CHECK IF IT CONTAINS ELEMENT */ + list_del(&dev->list); delete_device(dev); } @@ -151,7 +157,8 @@ int delete_device_by_name(char *name) list_for_each_entry_safe(dev, tmp, &devices, list) { if (strncmp(dev->usb.if_name, name, 128) != 0) continue; - + /* TEMPORARY FIX -- TODO: HOW TO CHECK IF IT CONTAINS ELEMENT */ + list_del(&dev->list); delete_device(dev); return 0; } @@ -166,7 +173,8 @@ int delete_device(struct device *dev) dongle_destroy_dynamic_object(dev->ubus_obj); } - list_del(&dev->list); + /*if (dev->list) // how to check if list contains this element? + list_del(&dev->list);*/ free_device(dev); return 0; } @@ -367,32 +375,28 @@ int get_devices(void) perror("opendir"); goto fail_dr; } + while ((de = readdir(dir)) != NULL) { if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue; if (strstr(de->d_name, ":") || strstr(de->d_name, "usb")) continue; - snprintf(product_path, PATH_MAX, "%s%s/product", usb_path, de->d_name); memset(&st, 0, sizeof(st)); - rv = stat(product_path, &st); if (rv < 0) { //perror("stat"); continue; } - snprintf(path, PATH_MAX, "%s%s/", usb_path, de->d_name); name = get_device_name(path); if (!name) continue; - dev = (struct device *)calloc(1, sizeof(*dev)); if (!dev) { perror("calloc"); goto fail_dev; } - dev->usb.product = get_usb_stat(usb_path, de->d_name, "product"); dev->usb.product_id = get_usb_stat(usb_path, de->d_name, "idProduct"); dev->usb.vendor_id = get_usb_stat(usb_path, de->d_name, "idVendor"); @@ -401,7 +405,6 @@ int get_devices(void) add_device(dev); } - closedir(dir); return 0; fail_dev: