diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/preadv2.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/preadv2.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/preadv2.c b/sysdeps/unix/sysv/linux/preadv2.c index 137e2dd791..c7f91025f2 100644 --- a/sysdeps/unix/sysv/linux/preadv2.c +++ b/sysdeps/unix/sysv/linux/preadv2.c @@ -32,7 +32,7 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset, # ifdef __NR_preadv2 ssize_t result = SYSCALL_CANCEL (preadv2, fd, vector, count, LO_HI_LONG (offset), flags); - if (result >= 0) + if (result >= 0 || errno != ENOSYS) return result; # endif /* Trying to emulate the preadv2 syscall flags is troublesome: @@ -49,7 +49,10 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset, __set_errno (ENOTSUP); return -1; } - return preadv (fd, vector, count, offset); + if (offset == -1) + return __readv (fd, vector, count); + else + return preadv (fd, vector, count, offset); } #endif |