diff options
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); } |