uinput: split uinput device creation into a helper function
authorPeter Hutterer <peter.hutterer@who-t.net>
Wed, 6 Apr 2016 05:32:56 +0000 (15:32 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 7 Apr 2016 01:05:00 +0000 (11:05 +1000)
No functional changes. This is prep work for supporting the new
UIDEV_DEV_SETUP ioctl.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
libevdev/libevdev-uinput.c

index 1316952eaf9fe937c12dfa9bc138493f776c7653..0046607084785f25d36be40de8f0fe671ae86aa3 100644 (file)
@@ -271,29 +271,12 @@ fetch_syspath_and_devnode(struct libevdev_uinput *uinput_dev)
        return uinput_dev->devnode ? 0 : -1;
 }
 
-LIBEVDEV_EXPORT int
-libevdev_uinput_create_from_device(const struct libevdev *dev, int fd, struct libevdev_uinput** uinput_dev)
+static int
+uinput_create(const struct libevdev *dev, int fd,
+             struct libevdev_uinput *new_device)
 {
        int rc;
        struct uinput_user_dev uidev;
-       struct libevdev_uinput *new_device;
-       int close_fd_on_error = (fd == LIBEVDEV_UINPUT_OPEN_MANAGED);
-
-       new_device = alloc_uinput_device(libevdev_get_name(dev));
-       if (!new_device)
-               return -ENOMEM;
-
-       if (fd == LIBEVDEV_UINPUT_OPEN_MANAGED) {
-               fd = open("/dev/uinput", O_RDWR|O_CLOEXEC);
-               if (fd < 0)
-                       goto error;
-
-               new_device->fd_is_managed = 1;
-       } else if (fd < 0) {
-               log_bug(NULL, "Invalid fd %d\n", fd);
-               errno = EBADF;
-               goto error;
-       }
 
        memset(&uidev, 0, sizeof(uidev));
 
@@ -316,6 +299,39 @@ libevdev_uinput_create_from_device(const struct libevdev *dev, int fd, struct li
                goto error;
        }
 
+       errno = 0;
+
+error:
+       return -errno;
+}
+
+LIBEVDEV_EXPORT int
+libevdev_uinput_create_from_device(const struct libevdev *dev, int fd, struct libevdev_uinput** uinput_dev)
+{
+       int rc;
+       struct libevdev_uinput *new_device;
+       int close_fd_on_error = (fd == LIBEVDEV_UINPUT_OPEN_MANAGED);
+
+       new_device = alloc_uinput_device(libevdev_get_name(dev));
+       if (!new_device)
+               return -ENOMEM;
+
+       if (fd == LIBEVDEV_UINPUT_OPEN_MANAGED) {
+               fd = open("/dev/uinput", O_RDWR|O_CLOEXEC);
+               if (fd < 0)
+                       goto error;
+
+               new_device->fd_is_managed = 1;
+       } else if (fd < 0) {
+               log_bug(NULL, "Invalid fd %d\n", fd);
+               errno = EBADF;
+               goto error;
+       }
+
+       rc = uinput_create(dev, fd, new_device);
+       if (rc != 0)
+               goto error;
+
        /* ctime notes time before/after ioctl to help us filter out devices
           when traversing /sys/devices/virtual/input to find the device
           node.