summaryrefslogtreecommitdiff
path: root/libgcompat/uio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgcompat/uio.c')
-rw-r--r--libgcompat/uio.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/libgcompat/uio.c b/libgcompat/uio.c
new file mode 100644
index 0000000..797cb3a
--- /dev/null
+++ b/libgcompat/uio.c
@@ -0,0 +1,32 @@
+#include <sys/syscall.h>
+#include <sys/uio.h> /* iovec, pwritev, preadv */
+#include <errno.h> /* errno */
+#include <unistd.h> /* syscall */
+
+ssize_t pwritev64v2(int fd, const struct iovec *iov, int count, off_t ofs, int flags)
+{
+ if (flags != 0) {
+ errno = ENOTSUP;
+ return -1;
+ }
+
+ if (ofs == -1) {
+ return writev(fd, iov, count);
+ }
+
+ return syscall(__NR_pwritev2, fd, iov, count, ofs);
+}
+
+ssize_t preadv64v2(int fd, const struct iovec *iov, int count, off_t ofs, int flags)
+{
+ if (flags != 0) {
+ errno = ENOTSUP;
+ return -1;
+ }
+
+ if (ofs == -1) {
+ return readv(fd, iov, count);
+ }
+
+ return syscall(__NR_preadv2, fd, iov, count, ofs);
+}