1 /* $OpenBSD: sigmask.c,v 1.5 2012/02/20 01:49:09 guenther Exp $ */
2 /* PUBLIC DOMAIN July 2003 Marco S Hyman <marc@snafu.org> */
3 
4 #include <sys/time.h>
5 
6 #include <pthread.h>
7 #include <signal.h>
8 #include <unistd.h>
9 
10 #include "test.h"
11 
12 /*
13  * Test that masked signals with a default action of terminate process
14  * do NOT terminate the process.
15  */
16 int main (int argc, char *argv[])
17 {
18 	sigset_t mask;
19 	int sig;
20 	int r;
21 
22 	/* any two (or more) command line args should cause the program
23 	   to die */
24 	if (argc > 2) {
25 		printf("trigger sigalrm[1] [test should die]\n");
26 		ualarm(100000, 0);
27 		CHECKe(sleep(1));
28 	}
29 
30 	/* mask sigalrm */
31 	CHECKe(sigemptyset(&mask));
32 	CHECKe(sigaddset(&mask, SIGALRM));
33 	CHECKr(pthread_sigmask(SIG_BLOCK, &mask, NULL));
34 
35 	/* make sure pthread_sigmask() returns the right value on failure */
36 	r = pthread_sigmask(-1, &mask, NULL);
37 	ASSERTe(r, == EINVAL);
38 
39 	/* now trigger sigalrm and wait for it */
40 	printf("trigger sigalrm[2] [masked, test should not die]\n");
41 	ualarm(100000, 0);
42 	CHECKe(sleep(1));
43 
44 	/* sigwait for sigalrm, it should be pending.   If it is not
45 	   the test will hang. */
46 	CHECKr(sigwait(&mask, &sig));
47 	ASSERT(sig == SIGALRM);
48 
49 	/* make sure sigwait didn't muck with the mask by triggering
50 	   sigalrm, again */
51 	printf("trigger sigalrm[3] after sigwait [masked, test should not die]\n");
52 	ualarm(100000, 0);
53 	CHECKe(sleep(1));
54 
55 	/* any single command line arg will run this code wich unmasks the
56 	   signal and then makes sure the program terminates when sigalrm
57 	   is triggered. */
58 	if (argc > 1) {
59 		printf("trigger sigalrm[4] [unmasked, test should die]\n");
60 		CHECKr(pthread_sigmask(SIG_UNBLOCK, &mask, NULL));
61 		ualarm(100000, 0);
62 		CHECKe(sleep(1));
63 	}
64 
65 	SUCCEED;
66 }
67