diff options
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 | 
