diff options
Diffstat (limited to 'rcm-server-main.c')
-rw-r--r-- | rcm-server-main.c | 307 |
1 files changed, 2 insertions, 305 deletions
diff --git a/rcm-server-main.c b/rcm-server-main.c index d2f0160..7aadb69 100644 --- a/rcm-server-main.c +++ b/rcm-server-main.c @@ -2,7 +2,6 @@ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> -#include <libudev.h> #include <unistd.h> #include <string.h> #include <systemd/sd-bus.h> @@ -15,6 +14,7 @@ #include "utils.h" #include "shared.h" #include "rcm-server-main.h" +#include "rcm-server-udev.h" #include "rcm-server-keymap.h" #include "rcm-server-evdev.h" #include "rcm-server-kdb.h" @@ -854,308 +854,6 @@ static const sd_bus_vtable device_vtable[] = { SD_BUS_VTABLE_END }; -static void -remove_device(struct manager *mgr, struct udev_device *udev) -{ - const char *name; - struct device *device; - - name = udev_device_get_sysname(udev); - printf("Asked to remove device %s\n", name); - - 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); - mgr->num_devices--; - break; - } -} - -static int -lirc_read(sd_event_source *s, int fd, uint32_t revents, void *userdata) -{ - struct device *device = userdata; - uint8_t buf[100]; - ssize_t bytes_read; - - if (fd != device->lirc_fd) - fprintf(stderr, "lirc fd mismatch: %i != %i\n", device->lirc_fd, fd); - - if (revents & EPOLLHUP) { - fprintf(stderr, "lirc connection closed!\n"); - close(fd); - device->lirc_fd = -1; - return 0; - } - - if (!(revents & EPOLLIN)) { - fprintf(stderr, "unexpected lirc event: %" PRIu32 "\n", revents); - return 0; - } - - while ((bytes_read = read(fd, buf, sizeof(buf))) > 0) - printf("Read %zi bytes from lirc dev\n", bytes_read); - - return 0; -} - -static int -lirc_setup(struct device *device, const char *path) -{ - if (!device) - return -EINVAL; - - if (device->lirc_fd >= 0) { - printf("Multiple lirc devices!?\n"); - return 0; - } - - device->lirc_fd = open(path, O_RDWR | O_NONBLOCK); - if (device->lirc_fd < 0) { - printf("Failed to open lirc device %s: %s\n", path, strerror(errno)); - return -errno; - } - - if (sd_event_add_io(device->mgr->event, &device->lirc_ev, - device->lirc_fd, EPOLLIN, lirc_read, device) < 0) { - printf("Failed to add event source for lirc device %s: %s\n", - path, strerror(errno)); - close(device->lirc_fd); - device->lirc_fd = -1; - return -errno; - } - - return 0; -} - -static void -add_device(struct manager *mgr, struct udev_device *udev) -{ - const char *name; - const char *str; - char *path; - struct device *device; - struct udev_enumerate *enumerate; - struct udev_list_entry *devices, *dev_list_entry; - int r; - - name = udev_device_get_sysname(udev); - if (asprintf(&path, "/org/gnome/RemoteControlManager/%s", name) < 0) { - fprintf(stderr, "asprintf failed: %m\n"); - return; - } - - device = malloc(sizeof(*device)); - if (!device) { - fprintf(stderr, "malloc failed: %m\n"); - free(path); - return; - } - - list_init(&device->keymaps); - device->mgr = mgr; - device->path = path; - device->name = device->path + strlen("/org/gnome/RemoteControlManager/"); - device->evdev_fd = -1; - device->lirc_fd = -1; - device->error = NULL; - device->input_name = NULL; - device->driver_name = NULL; - device->keymap_name = NULL; - device->dev_name = NULL; - - if (keymaps_load(device) < 0) { - fprintf(stderr, "failed to load keymaps: %m\n"); - free(path); - free(device); - return; - } - - enumerate = udev_enumerate_new(mgr->udev); - udev_enumerate_add_match_parent(enumerate, udev); - udev_enumerate_add_match_sysname(enumerate, "event*"); - udev_enumerate_add_match_sysname(enumerate, "lirc*"); - udev_enumerate_scan_devices(enumerate); - devices = udev_enumerate_get_list_entry(enumerate); - - udev_list_entry_foreach(dev_list_entry, devices) { - const char *path; - struct udev_device *udev_dev; - const char *devnode; - const char *subsys; - - path = udev_list_entry_get_name(dev_list_entry); - if (!path) { - printf("Failed to get udev name\n"); - continue; - } - - udev_dev = udev_device_new_from_syspath(mgr->udev, path); - if (!udev_dev) { - printf("Failed to create udev device\n"); - continue; - } - - devnode = udev_device_get_devnode(udev_dev); - if (!devnode) { - printf("Failed to determine udev_dev devnode\n"); - goto next; - } - - subsys = udev_device_get_subsystem(udev_dev); - if (!subsys) { - printf("Failed to determine udev_dev subsystem\n"); - goto next; - } - - if (!strcmp(subsys, "input")) { - r = evdev_setup(device, devnode); - if (r < 0) { - printf("Failed to setup evdev: %s\n", devnode); - device->error = "Error: Failed to setup evdev"; - goto next; - } - - } else if (!strcmp(subsys, "lirc")) { - r = lirc_setup(device, devnode); - if (r < 0) { - printf("Failed to setup lirc: %s\n", devnode); - device->error = "Error: Failed to setup lirc"; - goto next; - } - - } else { - printf("Unknown subsystem, ignored %s\n", devnode); - goto next; - } - -next: - udev_device_unref(udev_dev); - } - udev_enumerate_unref(enumerate); - - str = udev_device_get_sysattr_value(udev, "uevent"); - if (str) { - char tmp[strlen(str) + 1]; - char *token; - - strcpy(tmp, str); - - for (token = strtok(tmp, "\n"); token; token = strtok(NULL, "\n")) { - if (!strncmp(token, "DRV_NAME=", strlen("DRV_NAME="))) - device->driver_name = strdup(token + strlen("DRV_NAME=")); - else if (!strncmp(token, "NAME=", strlen("NAME="))) - device->keymap_name = strdup(token + strlen("NAME=")); - else if (!strncmp(token, "DEVNAME=", strlen("DEVNAME="))) - device->dev_name = strdup(token + strlen("DEVNAME=")); - else if (!strncmp(token, "MAJOR=", strlen("MAJOR="))) - continue; - else if (!strncmp(token, "MINOR=", strlen("MINOR="))) - continue; - else - printf("Unused uevent: %s\n", token); - } - } - - printf("Adding Device Object\n"); - printf("\tPath : %s\n", udev_device_get_syspath(udev)); - printf("\tNode : %s\n", udev_device_get_devnode(udev)); - printf("\tSubsystem : %s\n", udev_device_get_subsystem(udev)); - printf("\tDevtype : %s\n", udev_device_get_devtype(udev)); - printf("\tAction : %s\n", udev_device_get_action(udev)); - printf("\tName : %s\n", device->name); - printf("\tInput name: %s\n", device->input_name); - printf("\tDriver : %s\n", device->driver_name); - printf("\tKernel map: %s\n", device->keymap_name); - printf("\tDev name : %s\n", device->dev_name); - printf("\tevdev fd : %i\n", device->evdev_fd); - printf("\tLIRC fd : %i\n", device->lirc_fd); - printf("\tDBUS path : %s\n", device->path); - printf("\tProtocols : %s\n", - udev_device_get_sysattr_value(udev, "protocols")); - - list_add(&device->list, &mgr->devices); - mgr->num_devices++; - - sd_bus_emit_object_added(mgr->bus, path); -} - -static int -udev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata) -{ - struct manager *mgr = userdata; - struct udev_device *dev; - - if (revents & EPOLLHUP) { - fprintf(stderr, "udev connection closed!\n"); - return 0; - } - - if (!(revents & EPOLLIN)) { - fprintf(stderr, "unexpected udev event: %" PRIu32 "\n", revents); - return 0; - } - - 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); - else if (!strcmp(udev_device_get_action(dev), "remove")) - remove_device(mgr, dev); - udev_device_unref(dev); - } - - return 1; -} - -static int -udev_setup(struct manager *mgr) -{ - struct udev_enumerate *enumerate; - struct udev_list_entry *devices, *dev_list_entry; - struct udev_device *dev; - - mgr->udev = udev_new(); - if (!mgr->udev) - return -ENOMEM; - - mgr->udev_mon = udev_monitor_new_from_netlink(mgr->udev, "udev"); - udev_monitor_filter_add_match_subsystem_devtype(mgr->udev_mon, "rc", NULL); - udev_monitor_enable_receiving(mgr->udev_mon); - - enumerate = udev_enumerate_new(mgr->udev); - udev_enumerate_add_match_subsystem(enumerate, "rc"); - udev_enumerate_scan_devices(enumerate); - devices = udev_enumerate_get_list_entry(enumerate); - - udev_list_entry_foreach(dev_list_entry, devices) { - const char *path; - - path = udev_list_entry_get_name(dev_list_entry); - if (!path) { - printf("Failed to get udev name\n"); - continue; - } - - dev = udev_device_new_from_syspath(mgr->udev, path); - if (!dev) { - printf("Failed to create udev device\n"); - continue; - } - - add_device(mgr, dev); - - udev_device_unref(dev); - } - udev_enumerate_unref(enumerate); - - return sd_event_add_io(mgr->event, &mgr->udev_ev, - udev_monitor_get_fd(mgr->udev_mon), - EPOLLIN, udev_read, mgr); -} - static int enumerator(sd_bus *bus, const char *path, void *userdata, char ***retnodes, sd_bus_error *error) { @@ -1194,8 +892,7 @@ free_manager(struct manager *mgr) { sd_event_source_unref(mgr->udev_ev); sd_bus_detach_event(mgr->bus); sd_event_unref(mgr->event); - udev_monitor_unref(mgr->udev_mon); - udev_unref(mgr->udev); + udev_close(mgr); while (!list_empty(&mgr->devices)) { struct device *dev = list_first_entry(&mgr->devices, typeof(*dev), list); |