[PATCH libevdev 6/8] Work around missing EVIOCGMTSLOTS ioctl
David Herrmann
dh.herrmann at gmail.com
Mon Oct 21 01:48:27 PDT 2013
Hi
On Mon, Oct 14, 2013 at 8:14 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> libevdev/libevdev.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
> index 29640f4..6f203e2 100644
> --- a/libevdev/libevdev.c
> +++ b/libevdev/libevdev.c
> @@ -498,11 +498,14 @@ sync_mt_state(struct libevdev *dev, int create_events)
> {
> int rc;
> int i;
> + int ioctl_success = 0;
> struct mt_state {
> int code;
> int val[MAX_SLOTS];
> } mt_state[ABS_MT_CNT];
>
> + memset(&mt_state, 0, sizeof(mt_state));
> +
> for (i = ABS_MT_MIN; i <= ABS_MT_MAX; i++) {
> int idx;
> if (i == ABS_MT_SLOT)
> @@ -514,8 +517,15 @@ sync_mt_state(struct libevdev *dev, int create_events)
> idx = i - ABS_MT_MIN;
> mt_state[idx].code = i;
> rc = ioctl(dev->fd, EVIOCGMTSLOTS(sizeof(struct mt_state)), &mt_state[idx]);
> - if (rc < 0)
> - goto out;
> + if (rc < 0) {
> + /* if the first ioctl fails with -EINVAL, chances are the kernel
> + doesn't support the ioctl. Simply continue */
> + if (errno == -EINVAL && !ioctl_success) {
> + rc = 0;
Why not check whether dev->num_slots is 0? Or isn't this guaranteed?
If it's not, you need to clear mt_state here.
> + } else /* if the second, ... ioctl fails, really fail */
> + goto out;
> + } else if (ioctl_success == 0)
> + ioctl_success = 1;
> }
>
> for (i = 0; i < dev->num_slots; i++) {
> --
> 1.8.3.1
>
> _______________________________________________
> Input-tools mailing list
> Input-tools at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/input-tools
More information about the Input-tools
mailing list