summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorandroid-build-prod (mdb) <android-build-team-robot@google.com>2018-04-26 08:15:40 -0700
committerandroid-build-merger <android-build-merger@google.com>2018-04-26 08:15:40 -0700
commita653af2ade3ffff1a3af9da1ecc0ce65bcb9acce (patch)
treef40b025afe9929b7c751b1de7ce51c8db2667844 /tests
parent773588351d2832d7bb24a39c9e7cf96c429e6d11 (diff)
parent4e3637bba3255f21b92317326e0774becc0b1383 (diff)
downloadextras-a653af2ade3ffff1a3af9da1ecc0ce65bcb9acce.tar.gz
Merge "Make the NOT_CONFIG_SYSVIPC test also exercise the syscalls" am: b849b1878c
am: 4e3637bba3 Change-Id: I55815b0bca398c5ff513a3699714170e5591dc7d
Diffstat (limited to 'tests')
-rw-r--r--tests/kernel.config/sysvipc_test.cpp55
1 files changed, 54 insertions, 1 deletions
diff --git a/tests/kernel.config/sysvipc_test.cpp b/tests/kernel.config/sysvipc_test.cpp
index 49952f01..9aeda122 100644
--- a/tests/kernel.config/sysvipc_test.cpp
+++ b/tests/kernel.config/sysvipc_test.cpp
@@ -18,6 +18,10 @@
#include <linux/kcmp.h>
#include <sys/syscall.h>
#endif
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
#include <unistd.h>
#include <gtest/gtest.h>
@@ -28,6 +32,45 @@ int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx
}
#endif
+int msgctl(int id, int cmd, msqid_ds* buf) {
+#if !defined(__LP64__) || defined(__mips__)
+ // Annoyingly, the kernel requires this for 32-bit but rejects it for 64-bit.
+ // Mips64 is an exception to this, it requires the flag.
+ cmd |= IPC_64;
+#endif
+#if defined(SYS_msgctl)
+ return syscall(SYS_msgctl, id, cmd, buf);
+#else
+ return syscall(SYS_ipc, MSGCTL, id, cmd, 0, buf, 0);
+#endif
+}
+
+int semctl(int id, int num, int cmd, semid_ds* buf) {
+#if !defined(__LP64__) || defined(__mips__)
+ // Annoyingly, the kernel requires this for 32-bit but rejects it for 64-bit.
+ // Mips64 is an exception to this, it requires the flag.
+ cmd |= IPC_64;
+#endif
+#if defined(SYS_msgctl)
+ return syscall(SYS_semctl, id, num, cmd, buf);
+#else
+ return syscall(SYS_ipc, SEMCTL, id, num, cmd, buf, 0);
+#endif
+}
+
+int shmctl(int id, int cmd, shmid_ds* buf) {
+#if !defined(__LP64__) || defined(__mips__)
+ // Annoyingly, the kernel requires this for 32-bit but rejects it for 64-bit.
+ // Mips64 is an exception to this, it requires the flag.
+ cmd |= IPC_64;
+#endif
+#if defined(SYS_shmctl)
+ return syscall(SYS_shmctl, id, cmd, buf);
+#else
+ return syscall(SYS_ipc, SHMCTL, id, cmd, 0, buf, 0);
+#endif
+}
+
TEST(kernel_config, NOT_CONFIG_SYSVIPC) {
#ifdef HAS_KCMP
pid_t pid = getpid();
@@ -36,9 +79,19 @@ TEST(kernel_config, NOT_CONFIG_SYSVIPC) {
EXPECT_EQ(-1, kcmp(pid, pid, KCMP_SYSVSEM, 0, 0));
EXPECT_EQ(EOPNOTSUPP, error);
#endif
- EXPECT_EQ(-1, access("/proc/sysvipc", F_OK));
+
+ EXPECT_EQ(-1, access("/proc/sysvipc", R_OK));
+
EXPECT_EQ(-1, access("/proc/sysvipc/msg", F_OK));
+ EXPECT_EQ(-1, msgctl(-1, IPC_STAT, nullptr));
+ EXPECT_EQ(ENOSYS, errno);
+
EXPECT_EQ(-1, access("/proc/sysvipc/sem", F_OK));
+ EXPECT_EQ(-1, semctl(-1, 0, IPC_STAT, nullptr));
+ EXPECT_EQ(ENOSYS, errno);
+
EXPECT_EQ(-1, access("/proc/sysvipc/shm", F_OK));
+ EXPECT_EQ(-1, shmctl(-1, IPC_STAT, nullptr));
+ EXPECT_EQ(ENOSYS, errno);
}