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