[PATCH] fcntl cleanup
Mark Salter
msalter at redhat.com
Fri May 4 12:16:34 UTC 2012
This patch aims to clean up the current support for fcntl in the
following ways:
* replace multiple istances of #ifdef selection between fcntl
and fcntl64 syscalls with a single INLINE_SYSCALL_FCNTL macro.
The fcntl64 syscall only exists on 32-bit systems and is
identical to the fcntl syscall except for the addition of
commands to support locking with 64-bit file offsets.
* only check for unsupported 64-bit locking commands in the
case of no LFS support or no fcntl64 syscall. This eliminates
unnecessary code for configurations which do support the
64-bit locking commands.
* add check for unsupported 64-bit locking commands which was
missing from the native threads case.
* in the non-native threads case, __libc_fcntl and __fcntl_nocancel
are identical, so make __libc_fcntl an alias of __fcntl_nocancel
to avoid two functions with the same code.
Signed-off-by: Mark Salter <msalter at redhat.com>
---
libc/sysdeps/linux/common/__syscall_fcntl.c | 55 ++++++++++++--------------
1 files changed, 25 insertions(+), 30 deletions(-)
diff --git a/libc/sysdeps/linux/common/__syscall_fcntl.c b/libc/sysdeps/linux/common/__syscall_fcntl.c
index 6d4c339..06146b4 100644
--- a/libc/sysdeps/linux/common/__syscall_fcntl.c
+++ b/libc/sysdeps/linux/common/__syscall_fcntl.c
@@ -16,6 +16,17 @@
#include <fcntl.h>
#include <bits/wordsize.h>
+/*
+ * The fcntl64 syscall only exists on 32-Bit systems. It is identical to
+ * the fcntl syscall except for additial commands providing 32-bit systems
+ * with file locking operations using 64-bit offsets.
+ */
+#if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64
+#define INLINE_SYSCALL_FCNTL(a,b,c) INLINE_SYSCALL(fcntl64, 3, (a), (b), (c))
+#else
+#define INLINE_SYSCALL_FCNTL(a,b,c) INLINE_SYSCALL(fcntl, 3, (a), (b), (c))
+#endif
+
extern __typeof(fcntl) __libc_fcntl;
libc_hidden_proto(__libc_fcntl)
@@ -28,20 +39,17 @@ int __fcntl_nocancel (int fd, int cmd, ...)
arg = va_arg (ap, void *);
va_end (ap);
-# if __WORDSIZE == 32
+# if __WORDSIZE == 32 && !(defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64)
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);
+ return INLINE_SYSCALL_FCNTL (fd, cmd, arg);
}
libc_hidden_def(__fcntl_nocancel)
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
int __libc_fcntl (int fd, int cmd, ...)
{
va_list ap;
@@ -51,39 +59,26 @@ int __libc_fcntl (int fd, int cmd, ...)
arg = va_arg (ap, void *);
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
+#if __WORDSIZE == 32 && !(defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64)
+ if (cmd == F_GETLK64 || cmd == F_SETLK64 || cmd == F_SETLKW64) {
+ __set_errno(ENOSYS);
+ return -1;
+ }
+#endif
+ if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
+ return INLINE_SYSCALL_FCNTL (fd, cmd, arg);
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 = INLINE_SYSCALL_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);
+strong_alias(__fcntl_nocancel,__libc_fcntl)
#endif
-}
libc_hidden_def(__libc_fcntl)
libc_hidden_proto(fcntl)
--
1.7.9.1
More information about the uClibc
mailing list