Home | History | Annotate | Download | only in sigwaitinfo
      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 
     36 void myhandler(int signo, siginfo_t * info, void *context)
     37 {
     38 	counter++;
     39 }
     40 
     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