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