From a5adfb3ea93da5f62157bc619f9945ed4675e9e2 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 12 Jul 2023 18:50:28 +0200 Subject: Let name, unique_id, and physical_location be empty if unavailable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libgamepad.h | 6 ++++++ libgamepad_open_device.c | 13 ++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libgamepad.h b/libgamepad.h index cd574b0..f77e16b 100644 --- a/libgamepad.h +++ b/libgamepad.h @@ -1526,17 +1526,23 @@ struct libgamepad_device { /** * Human-readable device (sub- or superdevice) name + * + * Empty if not available */ char *name; /** * ID that is supposted to be unique to the device * (sub- or superdevice) + * + * Empty if not available */ char *unique_id; /** * The location if the device + * + * Empty if not available */ char *physical_location; diff --git a/libgamepad_open_device.c b/libgamepad_open_device.c index 27c5600..9fa438e 100644 --- a/libgamepad_open_device.c +++ b/libgamepad_open_device.c @@ -166,7 +166,18 @@ libgamepad_open_device(struct libgamepad_device *devicep, int dirfd, const char #define GET_STRING(EVIOCMACRO, OUTPUT)\ do {\ for (;;) {\ - DEFER_EINTR((r = ioctl(devicep->fd, EVIOCMACRO(bufsize), buf)) < 0, fail_free_buf);\ + while ((r = ioctl(devicep->fd, EVIOCMACRO(bufsize), buf)) < 0) {\ + if (errno == EINTR) {\ + devicep->internals->deferred_error = EINTR;\ + continue;\ + } else if (errno == ENOENT) {\ + if (bufsize)\ + r = 0;\ + break;\ + } else {\ + goto fail_free_buf;\ + }\ + }\ if ((size_t)r < bufsize)\ break;\ new = realloc(buf, bufsize += 32);\ -- cgit v1.2.3-70-g09d2