[klibc] test: Add signal nodefer

Uncovered a bug in avr32 signal handling,
might come handy in testing other archs signal.

Signed-off-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: maximilian attems <max@stro.at>
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 @@
 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;
+}