mirror of
https://gitlab.freedesktop.org/libevdev/libevdev.git
synced 2025-12-25 00:00:15 +01:00
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>
This commit is contained in:
parent
f415f2a694
commit
2ff45c73a1
2 changed files with 18 additions and 13 deletions
|
|
@ -198,8 +198,17 @@ fetch_syspath_and_devnode(struct libevdev_uinput *uinput_dev)
|
|||
{
|
||||
struct dirent **namelist;
|
||||
int ndev, i;
|
||||
int rc;
|
||||
char buf[sizeof(SYS_INPUT_DIR) + 64] = SYS_INPUT_DIR;
|
||||
|
||||
/* FIXME: use new ioctl() here once kernel supports it */
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
* 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. 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.
|
||||
* @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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue