diff --git a/include/sys/uio.h b/include/sys/uio.h index 624ff4225492437a83b60a58231228374937cbae..60c5c2fed90c3b7d4250c47ecdb6427c00eaa2d7 100644 --- a/include/sys/uio.h +++ b/include/sys/uio.h @@ -11,6 +11,10 @@ extern "C" { #define __NEED_ssize_t #define __NEED_struct_iovec +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define __NEED_off_t +#endif + #ifdef _GNU_SOURCE #define __NEED_pid_t #endif @@ -20,6 +24,11 @@ extern "C" { ssize_t readv (int, const struct iovec *, int); ssize_t writev (int, const struct iovec *, int); +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +ssize_t preadv (int, const struct iovec *, int, off_t); +ssize_t pwritev (int, const struct iovec *, int, off_t); +#endif + #ifdef _GNU_SOURCE ssize_t process_vm_writev(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long); ssize_t process_vm_readv(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long); diff --git a/src/unistd/preadv.c b/src/unistd/preadv.c new file mode 100644 index 0000000000000000000000000000000000000000..371e46f8fc62806722d4ee64706058f71d67b1d5 --- /dev/null +++ b/src/unistd/preadv.c @@ -0,0 +1,13 @@ +#define _GNU_SOURCE +#include +#include +#include "syscall.h" +#include "libc.h" + +ssize_t preadv(int fd, const struct iovec *iov, int count, off_t ofs) +{ + return syscall_cp(SYS_preadv, fd, iov, count, + (long)(ofs), (long)(ofs>>32)); +} + +LFS64(preadv); diff --git a/src/unistd/pwritev.c b/src/unistd/pwritev.c new file mode 100644 index 0000000000000000000000000000000000000000..1df268d5a76f2b65c1a0fa4f136770665326375b --- /dev/null +++ b/src/unistd/pwritev.c @@ -0,0 +1,13 @@ +#define _GNU_SOURCE +#include +#include +#include "syscall.h" +#include "libc.h" + +ssize_t pwritev(int fd, const struct iovec *iov, int count, off_t ofs) +{ + return syscall_cp(SYS_pwritev, fd, iov, count, + (long)(ofs), (long)(ofs>>32)); +} + +LFS64(pwritev);