From: Matt Fleming <matt at console-pimps.org>
Uncovered a bug in avr32 signal handling,
might come handy in testing other archs signal.
Signed-off-by: Matt Fleming <matt at console-pimps.org>
Signed-off-by: maximilian attems <max at stro.at>
---
Seen on lmkl, any objections to add your test to klibc:
http://git.kernel.org/?p=libs/klibc/klibc.git;a=summary
We know archs were signal stuff is trouble some: x86_32, m68k, ..
Thank you.
usr/klibc/tests/Kbuild | 1 +
usr/klibc/tests/sig-nodefer.c | 55 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+), 0 deletions(-)
create mode 100644 usr/klibc/tests/sig-nodefer.c
diff --git a/usr/klibc/tests/Kbuild b/usr/klibc/tests/Kbuild
index a3e0254..b7978d4 100644
--- a/usr/klibc/tests/Kbuild
+++ b/usr/klibc/tests/Kbuild
@@ -35,6 +35,7 @@ select.shared-y := select.o
setenvtest.shared-y := setenvtest.o
setjmptest.shared-y := setjmptest.o
sigint.shared-y := sigint.o
+sig-nodefer.shared-y := sig-nodefer.o
socket.shared-y := socket.o
stat.shared-y := stat.o
statfs.shared-y := statfs.o
diff --git a/usr/klibc/tests/sig-nodefer.c b/usr/klibc/tests/sig-nodefer.c
new file mode 100644
index 0000000..e988806
--- /dev/null
+++ b/usr/klibc/tests/sig-nodefer.c
@@ -0,0 +1,55 @@
+/*
+ * Expected output of ./sig-defer:
+ * SIGUSR2: blocked
+ * SIGTERM: blocked
+ */
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+void handler(int signum)
+{
+ sigset_t mask;
+
+ sigprocmask(SIG_BLOCK, NULL, &mask);
+ printf("SIGUSR2: %s\n",
+ sigismember(&mask, SIGUSR2) ? "blocked" : "not
blocked");
+ printf("SIGTERM: %s\n",
+ sigismember(&mask, SIGTERM) ? "blocked" : "not
blocked");
+}
+
+int main(int argc, char **argv)
+{
+ pid_t pid;
+
+ pid = fork();
+ if (pid == -1) {
+ perror("fork");
+ exit(EXIT_FAILURE);
+ } else if (!pid) {
+ struct sigaction act;
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = handler;
+ act.sa_flags = SA_NODEFER;
+
+ sigaddset(&act.sa_mask, SIGUSR2);
+ sigaddset(&act.sa_mask, SIGTERM);
+
+ sigaction(SIGUSR1, &act, NULL);
+
+ pause();
+ } else {
+ int status;
+
+ sleep(3);
+ kill(pid, SIGUSR1);
+ waitpid(pid, &status, 0);
+ }
+
+ return 0;
+}
--
1.7.5.4