diff options
author | Peter S. Mazinger <ps.m@gmx.net> | 2011-04-21 23:45:12 +0200 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2012-06-15 14:00:41 +0200 |
commit | 24edbbd53a382f35a4365ae065f61d56579f52f1 (patch) | |
tree | 54556db6c9e65bb555734cd644d932ba9713489b /libc/sysdeps/linux/common | |
parent | fae8e7e498eadf7b859b49a5c6fe103ca447838b (diff) |
lseek, lseek64: add cancellation for all THREADS
LT_OLD provides cancellable versions, do it for all THREADS.
llseek.c: use newly added macros for offset handling.
Add a comment about endianness issue around offset.
Compile llseek.c only on 32bit archs.
Provide aliases for 64bit archs or if syscall is not available.
Signed-off-by: Peter S. Mazinger <ps.m@gmx.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Diffstat (limited to 'libc/sysdeps/linux/common')
-rw-r--r-- | libc/sysdeps/linux/common/llseek.c | 28 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/lseek.c | 24 |
2 files changed, 22 insertions, 30 deletions
diff --git a/libc/sysdeps/linux/common/llseek.c b/libc/sysdeps/linux/common/llseek.c index 333770af0..09f5435a4 100644 --- a/libc/sysdeps/linux/common/llseek.c +++ b/libc/sysdeps/linux/common/llseek.c @@ -9,30 +9,24 @@ #include <_lfs_64.h> #include <sys/syscall.h> -#include <unistd.h> -#include <stdint.h> +#include <bits/wordsize.h> /* Newer kernel ports have llseek() instead of _llseek() */ #if !defined __NR__llseek && defined __NR_llseek # define __NR__llseek __NR_llseek #endif -#ifdef __NR__llseek -off64_t lseek64(int fd, off64_t offset, int whence) +#if defined __NR__llseek && __WORDSIZE == 32 +# include <unistd.h> +# include <endian.h> +# include <cancel.h> +off64_t __NC(lseek64)(int fd, off64_t offset, int whence) { off64_t result; - return (off64_t)INLINE_SYSCALL(_llseek, 5, fd, (off_t) (offset >> 32), - (off_t) (offset & 0xffffffff), &result, whence) ?: result; + /* do we not need to handle the offset with __LONG_LONG_PAIR depending on endianness? */ + return (off64_t)INLINE_SYSCALL(_llseek, 5, fd, (off_t) OFF64_HI(offset), + (off_t) OFF64_LO(offset), &result, whence) ?: result; } -#else -off64_t lseek64(int fd, off64_t offset, int whence) -{ - return (off64_t)lseek(fd, (off_t) (offset), whence); -} -#endif -#ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(lseek64) -#else -libc_hidden_weak(lseek64) -strong_alias(lseek64,__libc_lseek64) +CANCELLABLE_SYSCALL(off64_t, lseek64, (int fd, off64_t offset, int whence), (fd, offset, whence)) +lt_libc_hidden(lseek64) #endif diff --git a/libc/sysdeps/linux/common/lseek.c b/libc/sysdeps/linux/common/lseek.c index 1ed956e84..688f2d0f9 100644 --- a/libc/sysdeps/linux/common/lseek.c +++ b/libc/sysdeps/linux/common/lseek.c @@ -9,19 +9,16 @@ #include <sys/syscall.h> #include <unistd.h> +#include <cancel.h> #ifdef __NR_lseek -_syscall3(__off_t, lseek, int, fildes, __off_t, offset, int, whence) -#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); -} +# define __NR___lseek_nocancel __NR_lseek +_syscall3(off_t, __NC(lseek), int, fd, off_t, offset, int, whence) #else # include <errno.h> -__off_t lseek(int fildes, __off_t offset attribute_unused, int whence) +off_t __NC(lseek)(int fd, off_t offset attribute_unused, int whence) { - if (fildes < 0) { + if (fd < 0) { __set_errno(EBADF); return -1; } @@ -40,9 +37,10 @@ __off_t lseek(int fildes, __off_t offset attribute_unused, int whence) return -1; } #endif -#ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(lseek) -#else -libc_hidden_weak(lseek) -strong_alias(lseek,__libc_lseek) +CANCELLABLE_SYSCALL(off_t, lseek, (int fd, off_t offset, int whence), (fd, offset, whence)) +lt_libc_hidden(lseek) +#if defined __UCLIBC_HAS_LFS__ && (__WORDSIZE == 64 || !defined __NR__llseek) +strong_alias_untyped(__NC(lseek),__NC(lseek64)) +strong_alias_untyped(lseek,lseek64) +lt_libc_hidden(lseek64) #endif |