1 /* $OpenBSD: signal.c,v 1.5 2003/07/31 21:48:06 deraadt Exp $ */
2 /* David Leonard <d@openbsd.org>, 2001. Public Domain. */
3
4 /*
5 * This program tests signal handler re-entrancy.
6 */
7
8 #include <pthread.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <signal.h>
13 #include "test.h"
14
15 volatile int alarmed;
16
17 static void *
sleeper(void * arg)18 sleeper(void *arg)
19 {
20 sigset_t mask;
21
22 /* Ignore all signals in this thread */
23 sigfillset(&mask);
24 CHECKe(sigprocmask(SIG_SETMASK, &mask, NULL));
25 ASSERT(sleep(3) == 0);
26 CHECKe(write(STDOUT_FILENO, "\n", 1));
27 SUCCEED;
28 }
29
30 static void
handler(int sig)31 handler(int sig)
32 {
33 int save_errno = errno;
34
35 alarmed = 1;
36 alarm(1);
37 signal(SIGALRM, handler);
38 errno = save_errno;
39 }
40
41 int
main(int argc,char * argv[])42 main(int argc, char *argv[])
43 {
44 pthread_t slpr;
45
46 ASSERT(signal(SIGALRM, handler) != SIG_ERR);
47 CHECKe(alarm(1));
48 CHECKr(pthread_create(&slpr, NULL, sleeper, NULL));
49 /* ASSERT(sleep(1) == 0); */
50 for (;;) {
51 if (alarmed) {
52 alarmed = 0;
53 CHECKe(write(STDOUT_FILENO, "!", 1));
54 }
55 }
56 }
57