aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libgamepad.h6
-rw-r--r--libgamepad_open_device.c13
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);\