_FILE_OFFSET_BITS=64 support for fcntl.
On Android, fcntl is always implemented by fcntl64(2). This means that
an LP32 binary can `fcntl(F_SETLK, struct flock)` (because fcntl64(2)
passes through to the 32-bit fcntl(2) to handle F_SETLK), and it can
also `fcntl(F_SETLK64, struct flock64)`. What it can't do before this
patch is set _FILE_OFFSET_BITS=64 and then `fcntl(F_SETLK, struct
flock)` where that `struct flock` is actually implicitly `struct
flock64`.
Move the kernel uapi structs out of the way, define them ourselves based
on __LP64__ and _FILE_OFFSET_BITS, and fix up the relevant F_ constants.
(Also add a .clang-format to turn off clang-format in libc/include/.)
Bug: N/A
Test: treehugger (and strace!)
Change-Id: Iccd6c83d9133e1efcf93a7b49a6ae0f1bbd3d58b
diff --git a/tests/fcntl_test.cpp b/tests/fcntl_test.cpp
index d7dce31..a8a4cc5 100644
--- a/tests/fcntl_test.cpp
+++ b/tests/fcntl_test.cpp
@@ -148,6 +148,20 @@
ASSERT_EQ(4, sb.st_size);
}
+TEST(fcntl, f_getlk) {
+ int fd = open("/proc/version", O_RDONLY);
+ ASSERT_TRUE(fd != -1);
+
+ struct flock check_lock;
+ check_lock.l_type = F_WRLCK;
+ check_lock.l_start = 0;
+ check_lock.l_whence = SEEK_SET;
+ check_lock.l_len = 0;
+
+ ASSERT_EQ(0, fcntl(fd, F_GETLK, &check_lock));
+ close(fd);
+}
+
TEST(fcntl, f_getlk64) {
int fd = open64("/proc/version", O_RDONLY);
ASSERT_TRUE(fd != -1);
@@ -158,9 +172,7 @@
check_lock.l_whence = SEEK_SET;
check_lock.l_len = 0;
- int rc = fcntl(fd, F_GETLK64, &check_lock);
- ASSERT_EQ(0, rc);
-
+ ASSERT_EQ(0, fcntl(fd, F_GETLK64, &check_lock));
close(fd);
}