From f74f77b155bd34f75193179d7e4ce63ace771af3 Mon Sep 17 00:00:00 2001 From: "Peter S. Mazinger" Date: Thu, 21 Apr 2011 23:03:32 +0200 Subject: fcntl: add cancellation to fcntl64, use cancel.h fcntl64 missed cancellation. Guard fcntl64 for 32bit archs. Reuse as much code as possible in __syscall_fcntl.c. Provide alias fcntl64 if that syscall is not available. Signed-off-by: Peter S. Mazinger Signed-off-by: Bernhard Reutner-Fischer --- libc/sysdeps/linux/common/__syscall_fcntl.c | 79 ++++++++------------------- libc/sysdeps/linux/common/__syscall_fcntl64.c | 22 ++++++-- 2 files changed, 39 insertions(+), 62 deletions(-) (limited to 'libc') diff --git a/libc/sysdeps/linux/common/__syscall_fcntl.c b/libc/sysdeps/linux/common/__syscall_fcntl.c index 6d4c339ab..d56f4a277 100644 --- a/libc/sysdeps/linux/common/__syscall_fcntl.c +++ b/libc/sysdeps/linux/common/__syscall_fcntl.c @@ -10,82 +10,47 @@ #include #include -#ifdef __UCLIBC_HAS_THREADS_NATIVE__ -#include /* Must come before . */ -#endif +#include /* Must come before . */ #include #include -extern __typeof(fcntl) __libc_fcntl; -libc_hidden_proto(__libc_fcntl) - -int __fcntl_nocancel (int fd, int cmd, ...) +int __NC(fcntl)(int fd, int cmd, long arg) { - va_list ap; - void *arg; - - va_start (ap, cmd); - arg = va_arg (ap, void *); - va_end (ap); - -# if __WORDSIZE == 32 +#if __WORDSIZE == 32 if (cmd == F_GETLK64 || cmd == F_SETLK64 || cmd == F_SETLKW64) { -# if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64 - return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); -# else +# if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64 + return __NC(fcntl64)(fd, cmd, arg); +# else __set_errno(ENOSYS); return -1; -# endif - } # endif - return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); + } +#endif + return INLINE_SYSCALL(fcntl, 3, fd, cmd, arg); } -libc_hidden_def(__fcntl_nocancel) -int __libc_fcntl (int fd, int cmd, ...) +int fcntl(int fd, int cmd, ...) { va_list ap; - void *arg; + long arg; va_start (ap, cmd); - arg = va_arg (ap, void *); + arg = va_arg (ap, long); va_end (ap); -#ifdef __UCLIBC_HAS_THREADS_NATIVE__ if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64)) -# if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64 - return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); -# else - return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); -# endif - + return __NC(fcntl)(fd, cmd, arg); +#ifdef __NEW_THREADS int oldtype = LIBC_CANCEL_ASYNC (); - -# if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64 - int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); -# else - int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); -# endif - + int result = __NC(fcntl)(fd, cmd, arg); LIBC_CANCEL_RESET (oldtype); - return result; -#else -# if __WORDSIZE == 32 - if (cmd == F_GETLK64 || cmd == F_SETLK64 || cmd == F_SETLKW64) { -# if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64 - return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); -# else - __set_errno(ENOSYS); - return -1; -# endif - } -# endif - return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); #endif } -libc_hidden_def(__libc_fcntl) - -libc_hidden_proto(fcntl) -weak_alias(__libc_fcntl,fcntl) -libc_hidden_weak(fcntl) +lt_strong_alias(fcntl) +lt_libc_hidden(fcntl) +#if defined __UCLIBC_HAS_LFS__ && !defined __NR_fcntl64 && __WORDSIZE == 32 +strong_alias_untyped(fcntl,fcntl64) +lt_strong_alias(fcntl64) +lt_libc_hidden(fcntl64) +#endif diff --git a/libc/sysdeps/linux/common/__syscall_fcntl64.c b/libc/sysdeps/linux/common/__syscall_fcntl64.c index 09291e5d7..5174d8ade 100644 --- a/libc/sysdeps/linux/common/__syscall_fcntl64.c +++ b/libc/sysdeps/linux/common/__syscall_fcntl64.c @@ -9,12 +9,16 @@ #include <_lfs_64.h> #include +#include -#ifdef __NR_fcntl64 +#if defined __NR_fcntl64 && __WORDSIZE == 32 # include # include -# define __NR___syscall_fcntl64 __NR_fcntl64 -static __inline__ _syscall3(int, __syscall_fcntl64, int, fd, int, cmd, long, arg) +# include + +# define __NR___fcntl64_nocancel __NR_fcntl64 +_syscall3(int, __NC(fcntl64), int, fd, int, cmd, long, arg) + int fcntl64(int fd, int cmd, ...) { long arg; @@ -24,7 +28,15 @@ int fcntl64(int fd, int cmd, ...) arg = va_arg(list, long); va_end(list); - return (__syscall_fcntl64(fd, cmd, arg)); + if (SINGLE_THREAD_P || (cmd != F_SETLKW64)) + return __NC(fcntl64)(fd, cmd, arg); +# ifdef __NEW_THREADS + int oldtype = LIBC_CANCEL_ASYNC(); + int result = __NC(fcntl64)(fd, cmd, arg); + LIBC_CANCEL_RESET(oldtype); + return result; +# endif } -libc_hidden_def(fcntl64) +lt_strong_alias(fcntl64) +lt_libc_hidden(fcntl64) #endif -- cgit v1.2.3