Home | History | Annotate | Download | only in sigprocmask
      1 /*
      2  * Copyright (c) 2003, Intel Corporation. All rights reserved.
      3  * Created by:  salwan.searty 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  Steps:
      9  1. Set the signal mask to only having SIGABRT.
     10  2. Call sigprocmask again, this time with a randomly generated value of
     11  how that is checked to make sure it does not equal any of the three defined
     12  values of how which are SIG_SETMASK, SIG_BLOCK, or SIG_UNBLOCK. This should
     13  cause sigprocmask() to return -1. For the second parameter in the sigprocmask()
     14  function, use a set which contains SIGABRT and SIGALRM.
     15  3. Now verify using the is_changed() function that the only signal that is still
     16  in the signal mask is SIGABRT. Neither SIGALRM nor any other signal should be
     17  in the signal mask of the process.
     18 
     19 */
     20 
     21 #include <signal.h>
     22 #include <stdio.h>
     23 #include <stdlib.h>
     24 #include "posixtest.h"
     25 
     26 #define NUMSIGNALS (sizeof(siglist) / sizeof(siglist[0]))
     27 
     28 int is_changed(sigset_t set)
     29 {
     30 
     31 	int i;
     32 	int siglist[] = { SIGALRM, SIGBUS, SIGCHLD,
     33 		SIGCONT, SIGFPE, SIGHUP, SIGILL, SIGINT,
     34 		SIGPIPE, SIGQUIT, SIGSEGV,
     35 		SIGTERM, SIGTSTP, SIGTTIN, SIGTTOU,
     36 		SIGUSR1, SIGUSR2,
     37 #ifdef SIGPOLL
     38 		SIGPOLL,
     39 #endif
     40 #ifdef SIGPROF
     41 		SIGPROF,
     42 #endif
     43 		SIGSYS,
     44 		SIGTRAP, SIGURG, SIGVTALRM, SIGXCPU, SIGXFSZ
     45 	};
     46 
     47 	for (i = 0; i < NUMSIGNALS; i++) {
     48 		if (sigismember(&set, siglist[i]) != 0)
     49 			return 1;
     50 	}
     51 	return 0;
     52 }
     53 
     54 int get_rand(void)
     55 {
     56 
     57 	int r;
     58 	r = rand();
     59 	while ((r == SIG_BLOCK) || (r == SIG_SETMASK) || (r == SIG_UNBLOCK)) {
     60 		r = get_rand();
     61 	}
     62 	return r;
     63 }
     64 
     65 int main(void)
     66 {
     67 
     68 	int r = get_rand();
     69 	sigset_t actl, oactl;
     70 
     71 	sigemptyset(&actl);
     72 	sigemptyset(&oactl);
     73 	sigaddset(&actl, SIGABRT);
     74 
     75 	sigprocmask(SIG_SETMASK, &actl, NULL);
     76 
     77 	sigaddset(&actl, SIGALRM);
     78 	if (sigprocmask(r, &actl, NULL) != -1) {
     79 		perror
     80 		    ("sigprocmask() did not fail even though invalid how parameter was passed to it.\n");
     81 		return PTS_UNRESOLVED;
     82 	}
     83 
     84 	sigprocmask(SIG_SETMASK, NULL, &oactl);
     85 
     86 	if (sigismember(&oactl, SIGABRT) != 1) {
     87 		printf("FAIL: signal mask was changed. \n");
     88 		return PTS_FAIL;
     89 	}
     90 
     91 	if (is_changed(oactl)) {
     92 		printf("FAIL: signal mask was changed. \n");
     93 		return PTS_FAIL;
     94 	}
     95 
     96 	printf("Test PASSED: signal mask was not changed.\n");
     97 	return PTS_PASS;
     98 }
     99