summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Moyer <jmoyer@redhat.com>2018-01-12 10:53:15 -0500
committerJeff Moyer <jmoyer@redhat.com>2018-01-12 11:35:37 -0500
commitb112f6b45d995043614dd79e032753b0741c86d2 (patch)
treed29370907aed9854ba06fc5787d6acd7bac5c7c4
parenta6f4056fbc921382e2be7d09758b6fd37430b484 (diff)
downloadlibaio-b112f6b45d995043614dd79e032753b0741c86d2.tar.gz
syscall-generic: don't overwrite errno
The io_* system calls should not touch errno. Fix it. Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
-rw-r--r--src/syscall-generic.h14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/syscall-generic.h b/src/syscall-generic.h
index 24d7c7c..44d57f3 100644
--- a/src/syscall-generic.h
+++ b/src/syscall-generic.h
@@ -2,10 +2,16 @@
#include <unistd.h>
#include <sys/syscall.h>
-#define _body_io_syscall(sname, args...) \
-{ \
- int ret = syscall(__NR_##sname, ## args); \
- return ret < 0 ? -errno : ret; \
+#define _body_io_syscall(sname, args...) \
+{ \
+ int ret, saved_errno; \
+ saved_errno = errno; \
+ ret= syscall(__NR_##sname, ## args); \
+ if (ret < 0) { \
+ ret = -errno; \
+ errno = saved_errno; \
+ } \
+ return ret; \
}
#define io_syscall1(type,fname,sname,type1,arg1) \