• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2002-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  This program tests the assertion that if SA_SIGINFO is not set, then the
9  signal shall be received at least once
10 
11  Steps:
12  - Register for myhandler to be called when SIGTOTEST is called, and make
13    sure SA_SIGINFO is NOT SET.
14  - Block signal SIGTOTEST from the process.
15  - Using sigqueue(), send NUMCALLS instances of SIGTOTEST to the current
16    process.
17  - Verify that the handler is executed at least once AFTER SIGTOTEST
18    is unblocked.
19  */
20 
21 #define _XOPEN_SOURCE 600
22 #define _XOPEN_REALTIME 1
23 #define SIGTOTEST SIGRTMIN
24 #define NUMCALLS 5
25 
26 #include <signal.h>
27 #include <stdio.h>
28 #include <unistd.h>
29 #include <stdlib.h>
30 #include <errno.h>
31 #include "posixtest.h"
32 
33 int counter = 0;
34 
myhandler(int signo)35 void myhandler(int signo)
36 {
37 	counter++;
38 }
39 
main(void)40 int main(void)
41 {
42 	int pid, i;
43 	union sigval value;
44 	struct sigaction act;
45 
46 	act.sa_handler = myhandler;
47 	act.sa_flags = 0;
48 	sigemptyset(&act.sa_mask);
49 	sigaction(SIGTOTEST, &act, 0);
50 
51 	value.sival_int = 0;	/* 0 is just an arbitrary value */
52 	pid = getpid();
53 
54 	sighold(SIGTOTEST);
55 
56 	for (i = 0; i < NUMCALLS; i++) {
57 		if (sigqueue(pid, SIGTOTEST, value) != 0) {
58 			printf
59 			    ("Test UNRESOLVED: call to sigqueue did not return success\n");
60 			return PTS_UNRESOLVED;
61 		}
62 	}
63 
64 	if (0 != counter) {
65 		printf
66 		    ("Test UNRESOLVED: handler called even though %d has not been removed from the signal mask\n",
67 		     SIGTOTEST);
68 		return PTS_UNRESOLVED;
69 	}
70 
71 	sigrelse(SIGTOTEST);
72 
73 	if (counter < 1) {
74 		printf("Test FAILED: %d was not received even once\n",
75 		       SIGTOTEST);
76 		return PTS_FAIL;
77 	}
78 	printf("Test PASSED: %d was received %d times.\n", SIGTOTEST, counter);
79 	return PTS_PASS;
80 }
81