From: Peter Hutterer Date: Mon, 6 Apr 2015 21:12:01 +0000 (+1000) Subject: Accept LIBEVDEV_READ_FLAG_BLOCKING as valid flag X-Git-Tag: libevdev-1.4.1~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=97da13c3c4441b7ed7851dd215015998ad93320e;p=platform%2Fupstream%2Flibevdev.git Accept LIBEVDEV_READ_FLAG_BLOCKING as valid flag https://bugs.freedesktop.org/show_bug.cgi?id=89798 Signed-off-by: Peter Hutterer Reviewed-by: Benjamin Tissoires --- diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 0cdbe22..3a82fc7 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -989,6 +989,10 @@ libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_event { int rc = LIBEVDEV_READ_STATUS_SUCCESS; enum event_filter_status filter_status; + const unsigned int valid_flags = LIBEVDEV_READ_FLAG_NORMAL | + LIBEVDEV_READ_FLAG_SYNC | + LIBEVDEV_READ_FLAG_FORCE_SYNC | + LIBEVDEV_READ_FLAG_BLOCKING; if (!dev->initialized) { log_bug(dev, "device not initialized. call libevdev_set_fd() first\n"); @@ -996,7 +1000,7 @@ libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_event } else if (dev->fd < 0) return -EBADF; - if (!(flags & (LIBEVDEV_READ_FLAG_NORMAL|LIBEVDEV_READ_FLAG_SYNC|LIBEVDEV_READ_FLAG_FORCE_SYNC))) { + if ((flags & valid_flags) == 0) { log_bug(dev, "invalid flags %#x.\n", flags); return -EINVAL; } diff --git a/test/test-libevdev-events.c b/test/test-libevdev-events.c index c950959..44447a0 100644 --- a/test/test-libevdev-events.c +++ b/test/test-libevdev-events.c @@ -97,6 +97,38 @@ START_TEST(test_next_event_invalid_fd) } END_TEST +START_TEST(test_next_event_blocking) +{ + struct uinput_device* uidev; + struct libevdev *dev; + int fd, flags; + int rc; + struct input_event ev; + + test_create_device(&uidev, &dev, + EV_REL, REL_X, + EV_REL, REL_Y, + EV_KEY, BTN_LEFT, + -1); + + fd = libevdev_get_fd(dev); + flags = fcntl(fd, F_GETFL) & ~O_NONBLOCK; + rc = fcntl(fd, F_SETFL, flags); + ck_assert_int_eq(rc, 0); + + uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1); + uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); + rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_BLOCKING, &ev); + ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS); + ck_assert_int_eq(ev.type, EV_KEY); + ck_assert_int_eq(ev.code, BTN_LEFT); + ck_assert_int_eq(ev.value, 1); + + libevdev_free(dev); + uinput_device_free(uidev); +} +END_TEST + START_TEST(test_syn_dropped_event) { struct uinput_device* uidev; @@ -2116,6 +2148,7 @@ libevdev_events(void) TCase *tc = tcase_create("event polling"); tcase_add_test(tc, test_next_event); tcase_add_test(tc, test_next_event_invalid_fd); + tcase_add_test(tc, test_next_event_blocking); tcase_add_test(tc, test_syn_dropped_event); tcase_add_test(tc, test_double_syn_dropped_event); tcase_add_test(tc, test_event_type_filtered);