summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-10-08 13:43:20 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-10-23 09:04:41 +1000
commitae738d29ea651cecaf7fec616d5750b69d63649a (patch)
treea8298f5d855de8f73454db136428e41e5d24f7c0
parentf9bdb66ab47bfce41ce6a4c17eb9d58f741117d6 (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.c19
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;
}