[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