1/* 2* Copyright (c) 2005, Bull S.A.. All rights reserved. 3* Created by: Sebastien Decugis 4 5* This program is free software; you can redistribute it and/or modify it 6* under the terms of version 2 of the GNU General Public License as 7* published by the Free Software Foundation. 8* 9* This program is distributed in the hope that it would be useful, but 10* WITHOUT ANY WARRANTY; without even the implied warranty of 11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12* 13* You should have received a copy of the GNU General Public License along 14* with this program; if not, write the Free Software Foundation, Inc., 59 15* Temple Place - Suite 330, Boston MA 02111-1307, USA. 16 17 18* This sample test aims to check the following assertions: 19* 20* If SA_NODEFER is not set in sa_flags, the caught signal is added to the 21* thread's signal mask during the handler execution. 22 23* The steps are: 24* -> register a signal handler for SIGTTIN 25* -> raise SIGTTIN 26* -> In handler, check for reentrance then raise SIGTTIN again. 27 28* The test fails if signal handler if reentered or signal is not pending when raised again. 29*/ 30 31 32/* We are testing conformance to IEEE Std 1003.1, 2003 Edition */ 33#define _POSIX_C_SOURCE 200112L 34 35/******************************************************************************/ 36/*************************** standard includes ********************************/ 37/******************************************************************************/ 38#include <pthread.h> 39#include <stdarg.h> 40#include <stdio.h> 41#include <stdlib.h> 42#include <string.h> 43#include <unistd.h> 44 45#include <signal.h> 46#include <errno.h> 47 48/******************************************************************************/ 49/*************************** Test framework *******************************/ 50/******************************************************************************/ 51#include "testfrmw.h" 52#include "testfrmw.c" 53/* This header is responsible for defining the following macros: 54 * UNRESOLVED(ret, descr); 55 * where descr is a description of the error and ret is an int 56 * (error code for example) 57 * FAILED(descr); 58 * where descr is a short text saying why the test has failed. 59 * PASSED(); 60 * No parameter. 61 * 62 * Both three macros shall terminate the calling process. 63 * The testcase shall not terminate in any other maneer. 64 * 65 * The other file defines the functions 66 * void output_init() 67 * void output(char * string, ...) 68 * 69 * Those may be used to output information. 70 */ 71 72/******************************************************************************/ 73/**************************** Configuration ***********************************/ 74/******************************************************************************/ 75#ifndef VERBOSE 76#define VERBOSE 1 77#endif 78 79#define SIGNAL SIGTTIN 80 81/******************************************************************************/ 82/*************************** Test case ***********************************/ 83/******************************************************************************/ 84 85int called = 0; 86 87void handler( int sig ) 88{ 89 int ret; 90 sigset_t pending; 91 called++; 92 93 if ( called == 2 ) 94 { 95 FAILED( "Signal was not masked in signal handler" ); 96 } 97 98 if ( called == 1 ) 99 { 100 101 /* Raise the signal again. It should be masked */ 102 ret = raise( SIGNAL ); 103 104 if ( ret != 0 ) 105 { 106 UNRESOLVED( ret, "Failed to raise SIGTTIN again" ); 107 } 108 109 /* check the signal is pending */ 110 ret = sigpending( &pending ); 111 112 if ( ret != 0 ) 113 { 114 UNRESOLVED( ret, "Failed to get pending signal set" ); 115 } 116 117 ret = sigismember( &pending, SIGNAL ); 118 119 if ( ret != 1 ) 120 { 121 FAILED( "signal is not pending" ); 122 } 123 } 124 125 called++; 126} 127 128/* main function */ 129int main() 130{ 131 int ret; 132 133 struct sigaction sa; 134 135 /* Initialize output */ 136 output_init(); 137 138 /* Set the signal handler */ 139 sa.sa_flags = 0; 140 141 sa.sa_handler = handler; 142 143 ret = sigemptyset( &sa.sa_mask ); 144 145 if ( ret != 0 ) 146 { 147 UNRESOLVED( ret, "Failed to empty signal set" ); 148 } 149 150 /* Install the signal handler for SIGTTIN */ 151 ret = sigaction( SIGNAL, &sa, 0 ); 152 153 if ( ret != 0 ) 154 { 155 UNRESOLVED( ret, "Failed to set signal handler" ); 156 } 157 158 ret = raise( SIGNAL ); 159 160 if ( ret != 0 ) 161 { 162 UNRESOLVED( ret, "Failed to raise SIGTTIN" ); 163 } 164 165 while ( called != 4 ) 166 sched_yield(); 167 168 /* Test passed */ 169#if VERBOSE > 0 170 171 output( "Test passed\n" ); 172 173#endif 174 175 PASSED; 176} 177