1/* 2 * Copyright (c) 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 * 9 * Updated: 20-06-2011 Peter W. Morreale <pmorreale@novell.com> 10 * 11 * This program tests the assertion that if disp is SIG_HOLD, then the 12 * signal's disposition shall remain unchanged 13 * 14 * Steps: 15 * 1. Register SIGCHLD with myhandler 16 * 2. Add SIGCHLD to the process's signal mask using sigset with disp 17 * equal to SIG_HOLD 18 * 3. raise SIGCHLD 19 * 4. remove SIGCHLD from the signal mask 20 * 5. Verify that the original disposition hasn't been changed, by making 21 * sure that SIGCHLD is still handled by myhandler. 22 */ 23 24#define _XOPEN_SOURCE 600 25 26#include <signal.h> 27#include <stdio.h> 28#include <stdlib.h> 29#include <errno.h> 30#include <string.h> 31#include "posixtest.h" 32 33#define ERR_MSG(f, rc) printf("Failed: func: %s rc: %u errno: %s\n", \ 34 f, rc, strerror(errno)) 35 36static int handler_called; 37 38static void myhandler(int signo) 39{ 40 handler_called = 1; 41} 42 43int main(void) 44{ 45 sigset_t pendingset; 46 struct sigaction act; 47 int rc; 48 49 act.sa_handler = myhandler; 50 act.sa_flags = 0; 51 sigemptyset(&act.sa_mask); 52 53 rc = sigaction(SIGCHLD, &act, 0); 54 if (rc) { 55 ERR_MSG("sigaction()", rc); 56 return PTS_UNRESOLVED; 57 } 58 59 if (sigset(SIGCHLD, SIG_HOLD) == SIG_ERR) { 60 perror("Unexpected error while using sigset()"); 61 return PTS_UNRESOLVED; 62 } 63 64 raise(SIGCHLD); 65 66 rc = sigpending(&pendingset); 67 if (rc) { 68 ERR_MSG("sigpending()", rc); 69 return PTS_UNRESOLVED; 70 } 71 72 rc = sigismember(&pendingset, SIGCHLD); 73 if (rc != 1) { 74 ERR_MSG("sigismember()", rc); 75 return PTS_UNRESOLVED; 76 } 77 78 sigrelse(SIGCHLD); 79 80 if (!handler_called) { 81 printf("Failed: Signal not delivered\n"); 82 return PTS_FAIL; 83 } 84 85 printf("Test PASSED\n"); 86 return PTS_PASS; 87} 88