diff options
-rw-r--r-- | libgamepad.h | 6 | ||||
-rw-r--r-- | libgamepad_open_device.c | 13 |
2 files changed, 18 insertions, 1 deletions
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);\ |