From: Markos Chandras <markos.chand...@imgtec.com> Signed-off-by: Markos Chandras <markos.chand...@imgtec.com> --- libc/sysdeps/linux/common/__syscall_fcntl.c | 57 +++++++++++++++++++++++- libc/sysdeps/linux/common/__syscall_fcntl64.c | 5 ++ 2 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/libc/sysdeps/linux/common/__syscall_fcntl.c b/libc/sysdeps/linux/common/__syscall_fcntl.c index 6d4c339..83fad3d 100644 --- a/libc/sysdeps/linux/common/__syscall_fcntl.c +++ b/libc/sysdeps/linux/common/__syscall_fcntl.c @@ -19,6 +19,53 @@ extern __typeof(fcntl) __libc_fcntl; libc_hidden_proto(__libc_fcntl) + +#if defined(__NR_fcntl64) && ! defined (__NR_fcntl) + +int __libc_fcntl (int fd, int cmd, ...) +{ + va_list ap; + void* arg; + + va_start (ap, cmd); + arg = va_arg (ap, void*); + va_end (ap); + + return INLINE_SYSCALL(fcntl64, 3, fd, cmd, arg); +} +libc_hidden_def(__libc_fcntl) + +int __fcntl_nocancel (int fd, int cmd, ...) +{ + va_list ap; + void* arg; + + va_start (ap, cmd); + arg = va_arg (ap, void*); + va_end (ap); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ + if (SINGLE_THREAD_P) + return INLINE_SYSCALL(fcntl64, 3, fd, cmd, arg); + + int oldtype = LIBC_CANCEL_ASYNC (); + + int result = INLINE_SYSCALL(fcntl64, 3, fd, cmd, arg); + + LIBC_CANCEL_RESET (oldtype); + + return result; + +#else + + return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg); + +#endif +} +libc_hidden_def(__fcntl_nocancel) + +#else + int __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; @@ -70,7 +117,9 @@ int __libc_fcntl (int fd, int cmd, ...) LIBC_CANCEL_RESET (oldtype); return result; -#else + +#else /* __UCLIBC_HAS_THREADS_NATIVE__ */ + # if __WORDSIZE == 32 if (cmd == F_GETLK64 || cmd == F_SETLK64 || cmd == F_SETLKW64) { # if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64 @@ -80,12 +129,14 @@ int __libc_fcntl (int fd, int cmd, ...) return -1; # endif } -# endif +# endif /* __WORDSIZE */ return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); -#endif +#endif /* __UCLIBC_HAS_THREADS_NATIVE__ */ } libc_hidden_def(__libc_fcntl) +#endif + libc_hidden_proto(fcntl) weak_alias(__libc_fcntl,fcntl) libc_hidden_weak(fcntl) diff --git a/libc/sysdeps/linux/common/__syscall_fcntl64.c b/libc/sysdeps/linux/common/__syscall_fcntl64.c index e8782e9..93fdb16 100644 --- a/libc/sysdeps/linux/common/__syscall_fcntl64.c +++ b/libc/sysdeps/linux/common/__syscall_fcntl64.c @@ -27,4 +27,9 @@ int fcntl64(int fd, int cmd, ...) return (__syscall_fcntl64(fd, cmd, arg)); } libc_hidden_def(fcntl64) + +#if ! defined(__NR_fcntl) +strong_alias(fcntl64, fcntl) +#endif /* ! __NR_fcntl__ */ + #endif -- 1.7.1 _______________________________________________ uClibc mailing list uClibc@uclibc.org http://lists.busybox.net/mailman/listinfo/uclibc