diff options
| author | Peter Hutterer <peter.hutterer@who-t.net> | 2016-04-06 15:32:56 +1000 |
|---|---|---|
| committer | Peter Hutterer <peter.hutterer@who-t.net> | 2016-04-07 11:05:00 +1000 |
| commit | 7989eef75972d27ffc8b2b36eea4ca6c7fcd5435 (patch) | |
| tree | aff2a76889d2ef5951c317c4eb920c7e4042ebd0 /libevdev | |
| parent | 345a1589a58185e508b7ba4e76bf2d616e338186 (diff) | |
| download | libevdev-7989eef75972d27ffc8b2b36eea4ca6c7fcd5435.tar.gz | |
uinput: split uinput device creation into a helper function
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>
Diffstat (limited to 'libevdev')
| -rw-r--r-- | libevdev/libevdev-uinput.c | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/libevdev/libevdev-uinput.c b/libevdev/libevdev-uinput.c index 1316952..0046607 100644 --- a/libevdev/libevdev-uinput.c +++ b/libevdev/libevdev-uinput.c @@ -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. |
