From 6b65be4c4e78b86899f529197d777f7c5fa57e9e Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Sun, 28 Mar 2021 12:55:08 +0300 Subject: interactive-evdev: switch from epoll(2) to poll(2) Turns out FreeBSD supports evdev, so this toll can work on it; however it does not support epoll, so switch to poll, which is portable. Reported-by: Evgeniy Khramtsov Signed-off-by: Ran Benita --- tools/interactive-evdev.c | 45 +++++++++++++++++----------------------- tools/xkbcli-interactive-evdev.1 | 2 +- tools/xkbcli.1 | 2 +- tools/xkbcli.c | 2 +- 4 files changed, 22 insertions(+), 29 deletions(-) (limited to 'tools') diff --git a/tools/interactive-evdev.c b/tools/interactive-evdev.c index 9c8c94e..6b7c8a1 100644 --- a/tools/interactive-evdev.c +++ b/tools/interactive-evdev.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -38,7 +39,6 @@ #include #include -#include #include #include "xkbcommon/xkbcommon.h" @@ -313,33 +313,25 @@ read_keyboard(struct keyboard *kbd) static int loop(struct keyboard *kbds) { - int i, ret = 1; - int epfd = -1; struct keyboard *kbd; - struct epoll_event ev; - struct epoll_event evs[16]; + nfds_t nfds, i; + struct pollfd *fds = NULL; + int ret; - epfd = epoll_create1(0); - if (epfd < 0) { - fprintf(stderr, "Couldn't create epoll instance: %s\n", - strerror(errno)); + for (kbd = kbds, nfds = 0; kbd; kbd = kbd->next, nfds++) {} + fds = calloc(nfds, sizeof(*fds)); + if (fds == NULL) { + fprintf(stderr, "Out of memory"); goto out; } - for (kbd = kbds; kbd; kbd = kbd->next) { - memset(&ev, 0, sizeof(ev)); - ev.events = EPOLLIN; - ev.data.ptr = kbd; - ret = epoll_ctl(epfd, EPOLL_CTL_ADD, kbd->fd, &ev); - if (ret) { - fprintf(stderr, "Couldn't add %s to epoll: %s\n", - kbd->path, strerror(errno)); - goto out; - } + for (i = 0, kbd = kbds; kbd; kbd = kbd->next, i++) { + fds[i].fd = kbd->fd; + fds[i].events = POLLIN; } while (!terminate) { - ret = epoll_wait(epfd, evs, 16, -1); + ret = poll(fds, nfds, -1); if (ret < 0) { if (errno == EINTR) continue; @@ -348,18 +340,19 @@ loop(struct keyboard *kbds) goto out; } - for (i = 0; i < ret; i++) { - kbd = evs[i].data.ptr; - ret = read_keyboard(kbd); - if (ret) { - goto out; + for (i = 0, kbd = kbds; kbd; kbd = kbd->next, i++) { + if (fds[i].revents != 0) { + ret = read_keyboard(kbd); + if (ret) { + goto out; + } } } } ret = 0; out: - close(epfd); + free(fds); return ret; } diff --git a/tools/xkbcli-interactive-evdev.1 b/tools/xkbcli-interactive-evdev.1 index be1b70f..58be555 100644 --- a/tools/xkbcli-interactive-evdev.1 +++ b/tools/xkbcli-interactive-evdev.1 @@ -14,7 +14,7 @@ .Nm is a commandline tool to interactively debug XKB keymaps by listening to .Pa /dev/input/eventX -evdev devices (Linux). +evdev devices. . .Pp .Nm diff --git a/tools/xkbcli.1 b/tools/xkbcli.1 index 9ea0416..8bd13bf 100644 --- a/tools/xkbcli.1 +++ b/tools/xkbcli.1 @@ -40,7 +40,7 @@ Interactive debugger for XKB keymaps for Wayland, see .Xr xkbcli\-interactive\-wayland 1 . .It Ic interactive\-evdev -Interactive debugger for XKB keymaps for evdev (Linux), see +Interactive debugger for XKB keymaps for evdev, see .Xr xkbcli\-interactive\-evdev 1 . .It Ic list diff --git a/tools/xkbcli.c b/tools/xkbcli.c index 1f3ed3f..75f72fe 100644 --- a/tools/xkbcli.c +++ b/tools/xkbcli.c @@ -55,7 +55,7 @@ usage(void) #endif #if HAVE_XKBCLI_INTERACTIVE_EVDEV " interactive-evdev\n" - " Interactive debugger for XKB keymaps for evdev (Linux)\n" + " Interactive debugger for XKB keymaps for evdev\n" "\n" #endif #if HAVE_XKBCLI_COMPILE_KEYMAP -- cgit v1.2.1