diff options
Diffstat (limited to 'libgamepad_open_device.c')
-rw-r--r-- | libgamepad_open_device.c | 13 |
1 files changed, 12 insertions, 1 deletions
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);\ |