Home | History | Annotate | Download | only in sigpending
      1 /*
      2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
      3  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
      4  * This file is licensed under the GPL license.  For the full content
      5  * of this license, see the COPYING file at the top level of this
      6  * source tree.
      7 
      8  *  Test that the sigpending() function stores the set of signals that
      9  *  are blocked from delivery when there are signals blocked both
     10  *  in the main function and in the signal handler.
     11  *  1)  Block two signals from delivery to main process.
     12  *  2)  Block three signals from delivery to a signal handler.
     13  *  3)  Raise the signal to get into that signal handler.
     14  *  From the signal handler:
     15  *    4)  Raise one blocked signal in the signal handler.
     16  *    5)  Raise one blocked signal in the main process.
     17  *    5)  Verify that the two signals raised are shown via sigpending.
     18  *    6)  Verify the three signals not raised are not shown.
     19  */
     20 
     21 /*
     22  * Copyright (c) 2002, Intel Corporation. All rights reserved.
     23  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
     24  * This file is licensed under the GPL license.  For the full content
     25  * of this license, see the COPYING file at the top level of this
     26  * source tree.
     27 
     28  *  Signal handler uses exit() to leave so that the signals are not executed.
     29  */
     30 
     31 #include <signal.h>
     32 #include <stdio.h>
     33 #include <stdlib.h>
     34 #include "posixtest.h"
     35 
     36 void handler(int signo)
     37 {
     38 	sigset_t pendingset;
     39 
     40 	if (sigemptyset(&pendingset) == -1) {
     41 		printf("Could not call sigemptyset()\n");
     42 		exit(-1);
     43 	}
     44 	if (raise(SIGUSR2) != 0) {
     45 		printf("Could not raise SIGUSR2\n");
     46 		exit(-1);
     47 	}
     48 	if (raise(SIGCONT) != 0) {
     49 		printf("Could not raise SIGCONT\n");
     50 		exit(-1);
     51 	}
     52 
     53 	if (sigpending(&pendingset) == -1) {
     54 		printf("Error calling sigpending()\n");
     55 		exit(-1);
     56 	}
     57 
     58 	if (sigismember(&pendingset, SIGUSR2) == 1 &&
     59 	    sigismember(&pendingset, SIGCONT) == 1) {
     60 		printf("All pending signals found\n");
     61 		if ((sigismember(&pendingset, SIGHUP) == 0) &&
     62 		    (sigismember(&pendingset, SIGABRT) == 0) &&
     63 		    (sigismember(&pendingset, SIGUSR1) == 0)) {
     64 			printf("Unsent signals not found\n");
     65 			printf("Test PASSED\n");
     66 			exit(0);
     67 		} else {
     68 			printf("Error with unsent signals\n");
     69 			printf("Test FAILED\n");
     70 			exit(-1);
     71 		}
     72 	} else {
     73 		printf("Error with send signals\n");
     74 		printf("Test FAILED\n");
     75 		exit(-1);
     76 	}
     77 }
     78 
     79 int main(void)
     80 {
     81 	sigset_t blockset;
     82 	sigset_t prevset;
     83 	struct sigaction act;
     84 
     85 	act.sa_handler = handler;
     86 	act.sa_flags = 0;
     87 
     88 	if ((sigemptyset(&blockset) == -1) ||
     89 	    (sigemptyset(&prevset) == -1) ||
     90 	    (sigemptyset(&act.sa_mask) == -1)) {
     91 		printf("Could not call sigemptyset()\n");
     92 		return PTS_UNRESOLVED;
     93 	}
     94 
     95 	if ((sigaddset(&blockset, SIGUSR2) == -1) ||
     96 	    (sigaddset(&blockset, SIGHUP) == -1)) {
     97 		perror("Error calling sigaddset()\n");
     98 		return PTS_UNRESOLVED;
     99 	}
    100 
    101 	if (sigprocmask(SIG_SETMASK, &blockset, &prevset) == -1) {
    102 		printf("Could not call sigprocmask()\n");
    103 		return PTS_UNRESOLVED;
    104 	}
    105 
    106 	if ((sigaddset(&act.sa_mask, SIGCONT) == -1) ||
    107 	    (sigaddset(&act.sa_mask, SIGABRT) == -1) ||
    108 	    (sigaddset(&act.sa_mask, SIGUSR1) == -1)) {
    109 		perror("Error calling sigaddset()\n");
    110 		return PTS_UNRESOLVED;
    111 	}
    112 
    113 	if (sigaction(SIGTTOU, &act, 0) == -1) {
    114 		perror("Could not call sigaction()");
    115 		return PTS_UNRESOLVED;
    116 	}
    117 
    118 	if (raise(SIGTTOU) == -1) {
    119 		perror("Could not raise SIGTTOU");
    120 		return PTS_UNRESOLVED;
    121 	}
    122 	printf("This code should not be reachable\n");
    123 	return PTS_UNRESOLVED;
    124 }
    125