Make uinput-code backwards-compatible to missing UI_SET_PROPBIT ioctl
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 8 Oct 2013 03:43:20 +0000 (13:43 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 22 Oct 2013 23:04:41 +0000 (09:04 +1000)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
libevdev/libevdev-uinput.c

index dc6215965268cad67cea4fed9ced89d25707d271..ea9cf780674e84cae54d98388c18c5704a54d721 100644 (file)
 
 #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;
 }