summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/sysdeps/linux/common/llseek.c15
-rw-r--r--libc/sysdeps/linux/common/lseek.c25
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)