1 /* 2 Test case for assertion #1 of the sigaction system call that shows 3 sigaction (when used with a non-null act pointer) changes the action 4 for a signal. 5 6 Steps: 7 1. Use sigaction to setup a signal handler for SIGABRT 8 2. Add SIGABRT to the signal mask. 9 3. Raise SIGABRT. Now, SIGABRT is pending. 10 4. Call sigprocmask() again. Verify that global variable 11 sigprocmask_return_val is not set to anything other than 12 it's initial value (which is 1), while we're still inside 13 the signal handler code. 14 5. Once sigprocmask() returns, verify that it returns a zero, and 15 verify that the global handler_called variable has been set to 1; 16 6. If we manage to verify both steps 4 and 5, then we've 17 proved that signal was delivered before sigprocmask() returned. 18 19 */ 20 21 #include <signal.h> 22 #include <stdio.h> 23 #include <stdlib.h> 24 #include "posixtest.h" 25 26 int handler_called = 0; 27 int sigprocmask_return_val = 1; /* some value that's not a 1 or 0 */ 28 29 void handler(int signo) 30 { 31 handler_called = 1; 32 if (sigprocmask_return_val != 1) { 33 printf 34 ("FAIL: sigprocmask() returned before signal was delivered.\n"); 35 exit(PTS_FAIL); 36 } 37 } 38 39 int main(void) 40 { 41 struct sigaction act; 42 sigset_t blocked_set1; 43 sigemptyset(&blocked_set1); 44 sigaddset(&blocked_set1, SIGABRT); 45 46 act.sa_handler = handler; 47 act.sa_flags = 0; 48 sigemptyset(&act.sa_mask); 49 50 if (sigaction(SIGABRT, &act, 0) == -1) { 51 perror("Unexpected error while attempting to setup test " 52 "pre-conditions"); 53 return PTS_UNRESOLVED; 54 } 55 56 if (sigprocmask(SIG_SETMASK, &blocked_set1, NULL) == -1) { 57 perror 58 ("Unexpected error while attempting to use sigprocmask.\n"); 59 return PTS_UNRESOLVED; 60 } 61 62 if ((raise(SIGABRT) == -1)) { 63 perror("Unexpected error while attempting to setup test " 64 "pre-conditions"); 65 return PTS_UNRESOLVED; 66 } 67 68 sigprocmask_return_val = sigprocmask(SIG_UNBLOCK, &blocked_set1, NULL); 69 70 if (sigprocmask_return_val != 0) { 71 perror 72 ("Unexpected error while attempting to use sigprocmask.\n"); 73 return PTS_UNRESOLVED; 74 } 75 76 if (handler_called != 1) { 77 perror 78 ("Handler wasn't called, implying signal was not delivered.\n"); 79 return PTS_UNRESOLVED; 80 } 81 82 printf 83 ("Test PASSED: signal was delivered before the call to sigprocmask returned.\n"); 84 return PTS_PASS; 85 } 86