hidraw: do not open twice the same hidraw node

When using the same context, we do not want to open twice the same
hidraw node if two input node match it.
Store the sysname in the ratbag_device so we can check if it has been
opened previously.

Note that ratbag-command list still shows all input node as working
because we just close them as soon as we opened them.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
This commit is contained in:
Benjamin Tissoires
2015-10-07 18:23:01 -04:00
parent 1cbb80b7b4
commit 13c3d9a110
2 changed files with 26 additions and 10 deletions

View File

@@ -137,11 +137,24 @@ static int
ratbag_open_hidraw_node(struct ratbag_device *device, struct udev_device *hidraw_udev)
{
struct hidraw_devinfo info;
struct ratbag_device *tmp_device;
int fd, res;
const char *devnode;
const char *sysname;
device->hidraw.fd = -1;
sysname = udev_device_get_sysname(hidraw_udev);
if (!strneq("hidraw", sysname, 6))
return -ENODEV;
list_for_each(tmp_device, &device->ratbag->devices, link) {
if (tmp_device->hidraw.sysname &&
streq(tmp_device->hidraw.sysname, sysname)) {
return -ENODEV;
}
}
devnode = udev_device_get_devnode(hidraw_udev);
fd = ratbag_open_path(device, devnode, O_RDWR);
if (fd < 0)
@@ -187,6 +200,7 @@ ratbag_open_hidraw_node(struct ratbag_device *device, struct udev_device *hidraw
ratbag_hidraw_parse_report_descriptor(device);
}
device->hidraw.sysname = strdup(sysname);
return 0;
err:
@@ -219,7 +233,7 @@ ratbag_find_hidraw(struct ratbag_device *device, int (*match)(struct ratbag_devi
struct udev_enumerate *e;
struct udev_list_entry *entry;
struct udev_device *udev_device;
const char *path, *sysname;
const char *path;
struct udev_device *hid_udev;
struct udev_device *parent_udev;
struct udev *udev = ratbag->udev;
@@ -249,24 +263,20 @@ ratbag_find_hidraw(struct ratbag_device *device, int (*match)(struct ratbag_devi
if (!udev_device)
continue;
sysname = udev_device_get_sysname(udev_device);
if (!strneq("hidraw", sysname, 6)) {
udev_device_unref(udev_device);
continue;
}
rc = ratbag_open_hidraw_node(device, udev_device);
if (rc)
ratbag_close_hidraw(device);
goto skip;
matched = match(device);
udev_device_unref(udev_device);
if (matched == 1) {
rc = 0;
udev_device_unref(udev_device);
goto out;
}
skip:
ratbag_close_hidraw(device);
udev_device_unref(udev_device);
rc = -ENODEV;
}
@@ -295,6 +305,11 @@ ratbag_close_hidraw(struct ratbag_device *device)
if (device->hidraw.fd < 0)
return;
if (device->hidraw.sysname) {
free(device->hidraw.sysname);
device->hidraw.sysname = NULL;
}
ratbag_close_fd(device, device->hidraw.fd);
device->hidraw.fd = -1;

View File

@@ -38,6 +38,7 @@ struct ratbag_hidraw {
int fd;
uint8_t *report_ids;
unsigned num_report_ids;
char *sysname;
};
/**