X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=device.c;h=42b78e3584580a81e5573e877641908b1ef1232c;hp=c6765b0ce174e94509cf2a935584d72d34da48fa;hb=4f2a541e99b381c39b822ddaffb8f3941217463a;hpb=cd51d94890e819e6e72fd9dc221716131e69dea7 diff --git a/device.c b/device.c index c6765b0..42b78e3 100644 --- a/device.c +++ b/device.c @@ -228,6 +228,16 @@ struct device *device_get(const char *name, bool create) return dev; } +static void +device_delete(struct device *dev) +{ + if (!dev->avl.key) + return; + + avl_delete(&devices, &dev->avl); + dev->avl.key = NULL; +} + void device_cleanup(struct device *dev) { struct device_user *dep, *tmp; @@ -240,8 +250,7 @@ void device_cleanup(struct device *dev) dep->cb(dep, DEV_EVENT_REMOVE); } - if (dev->avl.key) - avl_delete(&devices, &dev->avl); + device_delete(dev); } void device_set_present(struct device *dev, bool state) @@ -377,17 +386,22 @@ device_create(const char *name, const struct device_type *type, change = device_check_config(odev, config); switch (change) { case DEV_CONFIG_APPLIED: + D(DEVICE, "Device '%s': config applied\n", odev->ifname); free(odev->config); odev->config = config; if (odev->present) { device_set_present(odev, false); device_set_present(odev, true); } - /* fall through */ + free(config); + return odev; case DEV_CONFIG_NO_CHANGE: + D(DEVICE, "Device '%s': no configuration change\n", odev->ifname); free(config); return odev; case DEV_CONFIG_RECREATE: + D(DEVICE, "Device '%s': recreate device\n", odev->ifname); + device_delete(odev); break; } }