diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-10-08 13:43:20 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-10-23 09:04:41 +1000 |
commit | ae738d29ea651cecaf7fec616d5750b69d63649a (patch) | |
tree | a8298f5d855de8f73454db136428e41e5d24f7c0 | |
parent | f9bdb66ab47bfce41ce6a4c17eb9d58f741117d6 (diff) |
Make uinput-code backwards-compatible to missing UI_SET_PROPBIT ioctl
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
-rw-r--r-- | libevdev/libevdev-uinput.c | 19 |
1 files changed, 18 insertions, 1 deletions
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; } |