Fix sigaction(3) for 64-bit.
Also clean up <signal.h> and revert the hacks that were necessary
for 64-bit in linker/debugger.cpp until now.
Change-Id: I3b0554ca8a49ee1c97cda086ce2c1954ebc11892
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp
index a719fe7..3070747 100644
--- a/tests/signal_test.cpp
+++ b/tests/signal_test.cpp
@@ -210,3 +210,44 @@
// Restore the original set.
assert(0 == sigprocmask(SIG_SETMASK, &original_set, NULL));
}
+
+static void EmptySignalHandler(int) {}
+static void EmptySignalAction(int, siginfo_t*, void*) {}
+
+TEST(signal, sigaction) {
+ // See what's currently set for SIGALRM.
+ struct sigaction sa;
+ memset(&sa, 0, sizeof(sa));
+ ASSERT_EQ(0, sigaction(SIGALRM, NULL, &sa));
+ ASSERT_TRUE(sa.sa_handler == NULL);
+ ASSERT_TRUE(sa.sa_sigaction == NULL);
+ ASSERT_TRUE(sa.sa_flags == 0);
+
+ // Set a traditional sa_handler signal handler.
+ memset(&sa, 0, sizeof(sa));
+ sigaddset(&sa.sa_mask, SIGALRM);
+ sa.sa_flags = SA_ONSTACK;
+ sa.sa_handler = EmptySignalHandler;
+ ASSERT_EQ(0, sigaction(SIGALRM, &sa, NULL));
+
+ // Check that we can read it back.
+ memset(&sa, 0, sizeof(sa));
+ ASSERT_EQ(0, sigaction(SIGALRM, NULL, &sa));
+ ASSERT_TRUE(sa.sa_handler == EmptySignalHandler);
+ ASSERT_TRUE((void*) sa.sa_sigaction == (void*) sa.sa_handler);
+ ASSERT_TRUE(sa.sa_flags == SA_ONSTACK);
+
+ // Set a new-style sa_sigaction signal handler.
+ memset(&sa, 0, sizeof(sa));
+ sigaddset(&sa.sa_mask, SIGALRM);
+ sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
+ sa.sa_sigaction = EmptySignalAction;
+ ASSERT_EQ(0, sigaction(SIGALRM, &sa, NULL));
+
+ // Check that we can read it back.
+ memset(&sa, 0, sizeof(sa));
+ ASSERT_EQ(0, sigaction(SIGALRM, NULL, &sa));
+ ASSERT_TRUE(sa.sa_sigaction == EmptySignalAction);
+ ASSERT_TRUE((void*) sa.sa_sigaction == (void*) sa.sa_handler);
+ ASSERT_TRUE(sa.sa_flags == (SA_ONSTACK | SA_SIGINFO));
+}