diff options
-rw-r--r-- | libc/sysdeps/linux/common/llseek.c | 15 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/lseek.c | 25 |
2 files changed, 28 insertions, 12 deletions
diff --git a/libc/sysdeps/linux/common/llseek.c b/libc/sysdeps/linux/common/llseek.c index ff16917e2..8b7cb7525 100644 --- a/libc/sysdeps/linux/common/llseek.c +++ b/libc/sysdeps/linux/common/llseek.c @@ -7,8 +7,8 @@ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ +#include <_lfs_64.h> #include <unistd.h> -#include <sys/types.h> #include <sys/syscall.h> /* Newer kernel ports have llseek() instead of _llseek() */ @@ -16,24 +16,19 @@ # define __NR__llseek __NR_llseek #endif -#if defined __NR__llseek && defined __UCLIBC_HAS_LFS__ - +#ifdef __NR__llseek loff_t lseek64(int fd, loff_t offset, int whence) { loff_t result; - return (loff_t)(INLINE_SYSCALL(_llseek, 5, fd, (off_t) (offset >> 32), - (off_t) (offset & 0xffffffff), &result, whence) ?: result); + return (loff_t)INLINE_SYSCALL(_llseek, 5, fd, (off_t) (offset >> 32), + (off_t) (offset & 0xffffffff), &result, whence) ?: result; } - #else - loff_t lseek64(int fd, loff_t offset, int whence) { - return (loff_t)(lseek(fd, (off_t) (offset), whence)); + return (loff_t)lseek(fd, (off_t) (offset), whence); } - #endif - #ifndef __LINUXTHREADS_OLD__ libc_hidden_def(lseek64) #else diff --git a/libc/sysdeps/linux/common/lseek.c b/libc/sysdeps/linux/common/lseek.c index 9ff424048..1ed956e84 100644 --- a/libc/sysdeps/linux/common/lseek.c +++ b/libc/sysdeps/linux/common/lseek.c @@ -12,12 +12,33 @@ #ifdef __NR_lseek _syscall3(__off_t, lseek, int, fildes, __off_t, offset, int, whence) -#else - +#elif defined __UCLIBC_HAS_LFS__ && defined __NR__llseek /* avoid circular dependency */ __off_t lseek(int fildes, __off_t offset, int whence) { return lseek64(fildes, offset, whence); } +#else +# include <errno.h> +__off_t lseek(int fildes, __off_t offset attribute_unused, int whence) +{ + if (fildes < 0) { + __set_errno(EBADF); + return -1; + } + + switch(whence) { + case SEEK_SET: + case SEEK_CUR: + case SEEK_END: + break; + default: + __set_errno(EINVAL); + return -1; + } + + __set_errno(ENOSYS); + return -1; +} #endif #ifndef __LINUXTHREADS_OLD__ libc_hidden_def(lseek) |