diff options
author | David Härdeman <david@hardeman.nu> | 2017-04-18 22:18:17 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2017-04-18 22:18:17 +0200 |
commit | 0c5c949451f6f8f71e4489db19390ba6f931e2af (patch) | |
tree | df5aeaeaf0926a74239d66cb993f317af7f83842 /rcm-server-udev.c | |
parent | 22f81fbe86e2920658948608ef9e87f8c1a03dc2 (diff) |
Add a device_free() function
Diffstat (limited to 'rcm-server-udev.c')
-rw-r--r-- | rcm-server-udev.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/rcm-server-udev.c b/rcm-server-udev.c index 797335b..77fb403 100644 --- a/rcm-server-udev.c +++ b/rcm-server-udev.c @@ -15,8 +15,34 @@ #include "rcm-server-lirc.h" #include "rcm-server-udev.h" +void +device_free(struct device *device) +{ + if (!device) + return; + + list_del(&device->list); + lirc_close(device); + evdev_close(device); + + free(device->path); + free(device->input_name); + free(device->driver_name); + free(device->keymap_name); + free(device->dev_name); + + while (!list_empty(&device->keymaps)) { + struct keymap *keymap = list_first_entry(&device->keymaps, typeof(*keymap), list); + list_del(&keymap->list); + free(keymap->name); + free(keymap); + } + + free(device); +} + static void -remove_device(struct manager *mgr, struct udev_device *udev) +device_remove(struct manager *mgr, struct udev_device *udev) { const char *name; struct device *device; @@ -27,15 +53,15 @@ remove_device(struct manager *mgr, struct udev_device *udev) list_for_each_entry(device, &mgr->devices, list) { if (strcmp(device->name, name)) continue; - list_del(&device->list); sd_bus_emit_object_removed(mgr->bus, device->path); + device_free(device); mgr->num_devices--; break; } } static void -add_device(struct manager *mgr, struct udev_device *udev) +device_add(struct manager *mgr, struct udev_device *udev) { const char *name; const char *str; @@ -205,9 +231,9 @@ udev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata) while ((dev = udev_monitor_receive_device(mgr->udev_mon))) { printf("Read device: %s\n", udev_device_get_syspath(dev)); if (!strcmp(udev_device_get_action(dev), "add")) - add_device(mgr, dev); + device_add(mgr, dev); else if (!strcmp(udev_device_get_action(dev), "remove")) - remove_device(mgr, dev); + device_remove(mgr, dev); udev_device_unref(dev); } @@ -249,7 +275,7 @@ udev_setup(struct manager *mgr) continue; } - add_device(mgr, dev); + device_add(mgr, dev); udev_device_unref(dev); } |