10dc076565f772bb1953209fb69ea150b494aaa40robbiew/* 20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2003, Intel Corporation. All rights reserved. 30dc076565f772bb1953209fb69ea150b494aaa40robbiew * Created by: salwan.searty REMOVE-THIS AT intel DOT com 40dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license. For the full content 52c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this 60dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree. 7aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 8aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 9aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * Updated: 20-06-2011 Peter W. Morreale <pmorreale@novell.com> 10aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 11aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * This program tests the assertion that if disp is SIG_HOLD, then the 12aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * signal's disposition shall remain unchanged 13aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 14aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * Steps: 15aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 1. Register SIGCHLD with myhandler 16aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 2. Add SIGCHLD to the process's signal mask using sigset with disp 17aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * equal to SIG_HOLD 18aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 3. raise SIGCHLD 19aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 4. remove SIGCHLD from the signal mask 20aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * 5. Verify that the original disposition hasn't been changed, by making 21aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale * sure that SIGCHLD is still handled by myhandler. 22aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale */ 230dc076565f772bb1953209fb69ea150b494aaa40robbiew 240dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600 250dc076565f772bb1953209fb69ea150b494aaa40robbiew 260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h> 270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h> 280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h> 29aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale#include <errno.h> 30aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale#include <string.h> 310dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h" 320dc076565f772bb1953209fb69ea150b494aaa40robbiew 33aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale#define ERR_MSG(f, rc) printf("Failed: func: %s rc: %u errno: %s\n", \ 34aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale f, rc, strerror(errno)) 35aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale 36aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morrealestatic int handler_called; 370dc076565f772bb1953209fb69ea150b494aaa40robbiew 38aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morrealestatic void myhandler(int signo) 390dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 400dc076565f772bb1953209fb69ea150b494aaa40robbiew handler_called = 1; 410dc076565f772bb1953209fb69ea150b494aaa40robbiew} 420dc076565f772bb1953209fb69ea150b494aaa40robbiew 43aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morrealeint main(void) 440dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 450dc076565f772bb1953209fb69ea150b494aaa40robbiew sigset_t pendingset; 460dc076565f772bb1953209fb69ea150b494aaa40robbiew struct sigaction act; 473001e4267cc8237aae4b6e56715388a3342133b4Peter W Morreale int rc; 483001e4267cc8237aae4b6e56715388a3342133b4Peter W Morreale 490dc076565f772bb1953209fb69ea150b494aaa40robbiew act.sa_handler = myhandler; 500dc076565f772bb1953209fb69ea150b494aaa40robbiew act.sa_flags = 0; 510dc076565f772bb1953209fb69ea150b494aaa40robbiew sigemptyset(&act.sa_mask); 520dc076565f772bb1953209fb69ea150b494aaa40robbiew 53aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale rc = sigaction(SIGCHLD, &act, 0); 54aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale if (rc) { 55aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale ERR_MSG("sigaction()", rc); 56aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale return PTS_UNRESOLVED; 57aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale } 580dc076565f772bb1953209fb69ea150b494aaa40robbiew 59666c72df6d66497922f17e85ee96f6be2bc5446bJan Stancek if (sigset(SIGCHLD, SIG_HOLD) == SIG_ERR) { 60666c72df6d66497922f17e85ee96f6be2bc5446bJan Stancek perror("Unexpected error while using sigset()"); 61aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale return PTS_UNRESOLVED; 62aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale } 630dc076565f772bb1953209fb69ea150b494aaa40robbiew 640dc076565f772bb1953209fb69ea150b494aaa40robbiew raise(SIGCHLD); 652c28215423293e443469a07ae7011135d058b671Garrett Cooper 66aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale rc = sigpending(&pendingset); 67aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale if (rc) { 68aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale ERR_MSG("sigpending()", rc); 69aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale return PTS_UNRESOLVED; 70aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale } 710dc076565f772bb1953209fb69ea150b494aaa40robbiew 72aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale rc = sigismember(&pendingset, SIGCHLD); 73aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale if (rc != 1) { 74aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale ERR_MSG("sigismember()", rc); 750dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 760dc076565f772bb1953209fb69ea150b494aaa40robbiew } 770dc076565f772bb1953209fb69ea150b494aaa40robbiew 780dc076565f772bb1953209fb69ea150b494aaa40robbiew sigrelse(SIGCHLD); 790dc076565f772bb1953209fb69ea150b494aaa40robbiew 80aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale if (!handler_called) { 81aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale printf("Failed: Signal not delivered\n"); 820dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_FAIL; 830dc076565f772bb1953209fb69ea150b494aaa40robbiew } 84aaba4acc57d46dec17f5a282d0a8cc5dcf4316a4Peter W Morreale 85de55e5ac14dc3e683117ae84bad34944fa7c38c6Cyril Hrubis printf("Test PASSED\n"); 860dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_PASS; 873001e4267cc8237aae4b6e56715388a3342133b4Peter W Morreale} 88