summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorRan Benita <ran@unusedvar.com>2021-03-28 12:55:08 +0300
committerRan Benita <ran@unusedvar.com>2021-03-28 14:39:03 +0300
commit6b65be4c4e78b86899f529197d777f7c5fa57e9e (patch)
tree9947fbd98aa351c9399f82c81c26ded26384ec47 /tools
parent62b5b4a170377468c38121acb113d773b5253314 (diff)
downloadxorg-lib-libxkbcommon-6b65be4c4e78b86899f529197d777f7c5fa57e9e.tar.gz
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 <evgeniy@khramtsov.org> Signed-off-by: Ran Benita <ran@unusedvar.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/interactive-evdev.c45
-rw-r--r--tools/xkbcli-interactive-evdev.12
-rw-r--r--tools/xkbcli.12
-rw-r--r--tools/xkbcli.c2
4 files changed, 22 insertions, 29 deletions
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 <getopt.h>
#include <limits.h>
#include <locale.h>
+#include <poll.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
@@ -38,7 +39,6 @@
#include <string.h>
#include <unistd.h>
-#include <sys/epoll.h>
#include <linux/input.h>
#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