diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2014-06-19 14:10:13 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2014-06-20 10:58:46 +1000 |
commit | 2ff45c73a1ce5577a4a06cf255a394d3c93d0915 (patch) | |
tree | fb3d06b828760bad20add83ac8ef5db9a2997973 | |
parent | f415f2a6943f24ff19f2fe1bdd955ac6863c478a (diff) | |
download | libevdev-2ff45c73a1ce5577a4a06cf255a394d3c93d0915.tar.gz |
uinput: use the UI_GET_SYSNAME ioctl if available
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
-rw-r--r-- | libevdev/libevdev-uinput.c | 14 | ||||
-rw-r--r-- | libevdev/libevdev-uinput.h | 21 |
2 files changed, 20 insertions, 15 deletions
diff --git a/libevdev/libevdev-uinput.c b/libevdev/libevdev-uinput.c index e0ae31e..f8607d1 100644 --- a/libevdev/libevdev-uinput.c +++ b/libevdev/libevdev-uinput.c @@ -198,8 +198,17 @@ fetch_syspath_and_devnode(struct libevdev_uinput *uinput_dev) { struct dirent **namelist; int ndev, i; - - /* FIXME: use new ioctl() here once kernel supports it */ + int rc; + char buf[sizeof(SYS_INPUT_DIR) + 64] = SYS_INPUT_DIR; + + rc = ioctl(uinput_dev->fd, + UI_GET_SYSNAME(sizeof(buf) - strlen(SYS_INPUT_DIR)), + &buf[strlen(SYS_INPUT_DIR)]); + if (rc != -1) { + uinput_dev->syspath = strdup(buf); + uinput_dev->devnode = fetch_device_node(buf); + return 0; + } ndev = scandir(SYS_INPUT_DIR, &namelist, is_input_device, alphasort); if (ndev <= 0) @@ -207,7 +216,6 @@ fetch_syspath_and_devnode(struct libevdev_uinput *uinput_dev) for (i = 0; i < ndev; i++) { int fd, len; - char buf[sizeof(SYS_INPUT_DIR) + 64]; struct stat st; strcpy(buf, SYS_INPUT_DIR); diff --git a/libevdev/libevdev-uinput.h b/libevdev/libevdev-uinput.h index fa3eae7..3212628 100644 --- a/libevdev/libevdev-uinput.h +++ b/libevdev/libevdev-uinput.h @@ -176,17 +176,14 @@ int libevdev_uinput_get_fd(const struct libevdev_uinput *uinput_dev); /** * @ingroup uinput * - * Return the syspath representing this uinput device. - * At the time of writing, the uinput kernel device does not - * provide a way to get the syspath directly through uinput so libevdev must guess. - * In some cases libevdev is unable to derive the syspath. If the running kernel - * supports the UI_GET_SYSNAME ioctl, the syspath is retrieved through that and will - * be reliable and not be NULL. The UI_GET_SYSNAME ioctl is currently - * scheduled for 3.15. - * - * @note This function may return NULL. libevdev currently uses ctime and - * the device name to guess devices. To avoid false positives, wait at least - * wait at least 1.5s between creating devices that have the same name. + * Return the syspath representing this uinput device. If the UI_GET_SYSNAME + * ioctl not available, libevdev makes an educated guess. + * The UI_GET_SYSNAME ioctl is available since Linux 3.15. + * + * @note This function may return NULL if UI_GET_SYSNAME is not available. + * In that case, libevdev uses ctime and the device name to guess devices. + * To avoid false positives, wait at least wait at least 1.5s between + * creating devices that have the same name. * @param uinput_dev A previously created uinput device. * @return The syspath for this device, including the preceding /sys * @@ -202,7 +199,7 @@ const char* libevdev_uinput_get_syspath(struct libevdev_uinput *uinput_dev); * This relies on libevdev_uinput_get_syspath() to provide a valid syspath. * See libevdev_uinput_get_syspath() for more details. * - * @note This function may return NULL. libevdev currently has to guess the + * @note This function may return NULL. libevdev may have to guess the * syspath and the device node. See libevdev_uinput_get_syspath() for details. * @param uinput_dev A previously created uinput device. * @return The device node for this device, in the form of /dev/input/eventN |