summaryrefslogtreecommitdiff
path: root/rcm-server-udev.c
diff options
context:
space:
mode:
Diffstat (limited to 'rcm-server-udev.c')
-rw-r--r--rcm-server-udev.c38
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);
}