From ae738d29ea651cecaf7fec616d5750b69d63649a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 8 Oct 2013 13:43:20 +1000 Subject: [PATCH] Make uinput-code backwards-compatible to missing UI_SET_PROPBIT ioctl Signed-off-by: Peter Hutterer Reviewed-by: David Herrmann --- libevdev/libevdev-uinput.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/libevdev/libevdev-uinput.c b/libevdev/libevdev-uinput.c index dc62159..ea9cf78 100644 --- a/libevdev/libevdev-uinput.c +++ b/libevdev/libevdev-uinput.c @@ -40,6 +40,14 @@ #define SYS_INPUT_DIR "/sys/devices/virtual/input/" +#ifndef UINPUT_IOCTL_BASE +#define UINPUT_IOCTL_BASE 'U' +#endif + +#ifndef UI_SET_PROPBIT +#define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int) +#endif + static struct libevdev_uinput * alloc_uinput_device(const char *name) { @@ -132,8 +140,17 @@ set_props(const struct libevdev *dev, int fd, struct uinput_user_dev *uidev) continue; rc = ioctl(fd, UI_SET_PROPBIT, prop); - if (rc == -1) + if (rc == -1) { + /* If UI_SET_PROPBIT is not supported, treat -EINVAL + * as success. The kernel only sends -EINVAL for an + * invalid ioctl, invalid INPUT_PROP_MAX or if the + * ioctl is called on an already created device. The + * last two can't happen here. + */ + if (errno == -EINVAL) + rc = 0; break; + } } return rc; } -- 2.34.1