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 set, then the
9 signal shall be queued to the receiving process and that sigqueue returns 0.
10
11 Steps:
12 - Register for myhandler to be called when SIGTOTEST is called, and make
13 sure SA_SIGINFO is set.
14 - Block signal SIGTOTEST from the process.
15 - Using sigqueue(), send NUMCALLS instances of SIGTOTEST to the current
16 process.
17 - Call sigwaitinfo() NUMCALLS times, and verify that the queued signals are
18 selected in FIFO order.
19
20 */
21
22 #define _XOPEN_SOURCE 600
23 #define _XOPEN_REALTIME 1
24 #define SIGTOTEST SIGRTMIN
25 #define NUMCALLS 5
26
27 #include <signal.h>
28 #include <stdio.h>
29 #include <unistd.h>
30 #include <stdlib.h>
31 #include <errno.h>
32 #include "posixtest.h"
33
34 int counter = 0;
35
myhandler(int signo,siginfo_t * info,void * context)36 void myhandler(int signo, siginfo_t * info, void *context)
37 {
38 counter++;
39 }
40
main(void)41 int main(void)
42 {
43 int pid, i;
44 union sigval value;
45 struct sigaction act;
46 sigset_t selectset;
47 siginfo_t info;
48
49 act.sa_flags = SA_SIGINFO;
50 act.sa_sigaction = myhandler;
51 sigemptyset(&act.sa_mask);
52 sigaction(SIGTOTEST, &act, 0);
53
54 pid = getpid();
55
56 sighold(SIGTOTEST);
57
58 for (i = NUMCALLS; i > 0; i--) {
59 value.sival_int = i;
60 if (sigqueue(pid, SIGTOTEST, value) != 0) {
61 printf
62 ("Test FAILED: call to sigqueue did not return success\n");
63 return PTS_FAIL;
64 }
65 }
66
67 sigemptyset(&selectset);
68 sigaddset(&selectset, SIGTOTEST);
69
70 for (i = NUMCALLS; i > 0; i--) {
71 if (sigwaitinfo(&selectset, &info) != SIGTOTEST) {
72 perror
73 ("sigwaitinfo() returned signal other than SIGTOTEST\n");
74 return PTS_UNRESOLVED;
75 }
76 if (info.si_value.sival_int != i) {
77 printf
78 ("Test FAILED: The queued value %d was dequeued before "
79 "the queued value %d even though %d was queued first.\n",
80 info.si_value.sival_int, i, i);
81 return PTS_FAIL;
82 }
83 }
84
85 return PTS_PASS;
86 }
87