Only have one copy of the kernel_sigset_t hack, and add more tests.
Change-Id: I377522fcba6fb4b5fd2754ab15b091014bd7c16f
diff --git a/libc/bionic/signalfd.cpp b/libc/bionic/signalfd.cpp
index 51fae83..b7e6474 100644
--- a/libc/bionic/signalfd.cpp
+++ b/libc/bionic/signalfd.cpp
@@ -28,27 +28,11 @@
#include <sys/signalfd.h>
-/* Despite the fact that our kernel headers define sigset_t explicitly
- * as a 32-bit integer, the kernel system call really expects a 64-bit
- * bitmap for the signal set, or more exactly an array of two-32-bit
- * values (see $KERNEL/arch/$ARCH/include/asm/signal.h for details).
- *
- * Unfortunately, we cannot fix the sigset_t definition without breaking
- * the C library ABI, so perform a little runtime translation here.
- */
-typedef union {
- sigset_t bionic;
- uint32_t kernel[2];
-} kernel_sigset_t;
+#include <private/kernel_sigset_t.h>
-extern "C" int signalfd4(int fd, kernel_sigset_t *mask, size_t sizemask, int flags);
+extern "C" int signalfd4(int fd, kernel_sigset_t* mask, size_t sizemask, int flags);
-int signalfd(int fd, const sigset_t *mask, int flags)
-{
- kernel_sigset_t in_set;
- in_set.kernel[0] = in_set.kernel[1] = 0;
-
- in_set.bionic = *mask;
-
- return signalfd4(fd, &in_set, sizeof(in_set), flags);
+int signalfd(int fd, const sigset_t* mask, int flags) {
+ kernel_sigset_t in_set(mask);
+ return signalfd4(fd, &in_set, sizeof(in_set), flags);
}