diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c index 65c0cdf8f89863298f045a43dd409b71ed095432..29f6c20b49cb822810c86d75de302149239a1016 100644 --- a/dongle_infrastructure.c +++ b/dongle_infrastructure.c @@ -28,8 +28,10 @@ char *get_device_ip(char *device_name); char *get_device_ip_alt(char *device_name); int tag_missing_devices(void); int add_device(struct device *node); +int delete_all_devices(void) int delete_device_by_name(char *name); -int delete_device_by_obj(struct device *dev); +int delete_device(struct device *dev); +void free_device(struct device *dev); struct device *search_list(char *name); enum { @@ -68,7 +70,7 @@ int tag_missing_devices(void) dev->missing++; if (dev->missing == 1) - delete_device_by_obj(dev); + delete_device(dev); } return 0; @@ -82,10 +84,11 @@ int add_device(struct device *new_dev) if (dev) { if (dev->ip) free(dev->ip); - dev->ip = new_dev->ip; - + dev->ip = strdup(new_dev->ip); dev->present = true; - goto fail; + + free_device(new_dev); + goto already_present; } new_dev->present = true; @@ -95,11 +98,12 @@ int add_device(struct device *new_dev) list_add_tail(&new_dev->list, &devices); if (new_dev->ip) { new_dev->ubus_obj = dongle_create_dynamic_object(new_dev); - publish_ubus_object(global_ctx, new_dev->ubus_obj); + if (new_dev->ubus_obj) + publish_ubus_object(global_ctx, new_dev->ubus_obj); } return 0; -fail: +already_present: return -1; } @@ -108,6 +112,7 @@ int delete_all_devices(void) struct device *dev, *tmp; list_for_each_entry_safe(dev, tmp, &devices, list) { + //call the other functions free(dev->usb.product_id); free(dev->usb.vendor_id); free(dev->usb.if_name); @@ -127,21 +132,29 @@ int delete_device_by_name(char *name) if (strncmp(dev->usb.if_name, name, 128) != 0) continue; - delete_device_by_obj(dev); + delete_device(dev); return 0; } return -1; } -int delete_device_by_obj(struct device *dev) +int delete_device(struct device *dev) { unpublish_ubus_object(global_ctx, dev->ubus_obj); + list_del(&dev->list); + free_device(dev); + return 0; +} + +void free_device(struct device *dev) +{ + if (!dev) + return; free(dev->usb.if_name); + // maybe not create a function to free usb.* free(dev->ip); - list_del(&dev->list); free(dev); - return 0; } struct device *search_list(char *name) @@ -346,10 +359,10 @@ int get_devices(void) perror("malloc"); goto fail_malloc; } + // memset zero node->usb.product = get_usb_stat(usb_path, de->d_name, "product"); node->usb.product_id = get_usb_stat(usb_path, de->d_name, "idProduct"); - node->usb.product_id = get_usb_stat(usb_path, de->d_name, "idProduct"); node->usb.vendor_id = get_usb_stat(usb_path, de->d_name, "idVendor"); node->usb.if_name = name; node->ip = get_device_ip(node->usb.if_name); @@ -593,6 +606,7 @@ int publish_ubus_object(struct ubus_context *ctx, struct ubus_object *obj) { int ret; + // check obj == NULL ret = ubus_add_object(ctx, obj); if (ret != 0) { printf("Failed to publish object: %s\n", obj->name); diff --git a/dongle_infrastructure.h b/dongle_infrastructure.h index 758baf49e3d68f99b243b40cb3a3d1bab04e99d5..9c9dee649c1a787069c1d10e90db046a495a8b07 100644 --- a/dongle_infrastructure.h +++ b/dongle_infrastructure.h @@ -14,11 +14,12 @@ struct USB { struct device { struct ubus_object *ubus_obj; - struct list_head list; struct USB usb; char *ip; int missing; bool present; + + struct list_head list; }; int expose_infrastructure_object(struct ubus_context *ctx);