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 This program tests the assertion that if disp is SIG_HOLD, then the
9 signal shall be added to the process's signal mask.
10
11 Steps:
12 1. Register SIGCHLD with myhandler
13 2. Add SIGCHLD to the process's signal mask using sigset with disp
14    equal to SIG_HOLD
15 3. raise SIGCHLD
16 4. Verify that SIGCHLD is pending.
17*/
18
19#define _XOPEN_SOURCE 600
20
21#include <signal.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <errno.h>
25#include <string.h>
26#include "posixtest.h"
27
28#define ERR_MSG(f, rc) printf("Failed: func: %s rc: %u errno: %s\n", \
29						f, rc, strerror(errno))
30
31void myhandler(int signo)
32{
33	printf("SIGCHLD called. Inside handler\n");
34}
35
36int main(void)
37{
38	sigset_t pendingset;
39	struct sigaction act;
40	act.sa_handler = myhandler;
41	act.sa_flags = 0;
42	sigemptyset(&act.sa_mask);
43	int rc;
44
45	rc = sigaction(SIGCHLD, &act, 0);
46	if (rc) {
47		ERR_MSG("sigaction()", rc);
48		return PTS_UNRESOLVED;
49	}
50
51	if (sigset(SIGCHLD, SIG_HOLD) == SIG_ERR) {
52		perror("Unexpected error while using sigset()");
53		return PTS_UNRESOLVED;
54	}
55
56	raise(SIGCHLD);
57
58	rc = sigpending(&pendingset);
59	if (rc) {
60		ERR_MSG("sigpending()", rc);
61		return PTS_UNRESOLVED;
62	}
63
64	if (sigismember(&pendingset, SIGCHLD) != 1) {
65		printf("Test FAILED: Signal SIGCHLD wasn't hold.\n");
66		return PTS_FAIL;
67	}
68
69	printf("Test PASSED\n");
70	return PTS_PASS;
71}
72