1/*
2
3 * Copyright (c) 2002-2003, Intel Corporation. All rights reserved.
4 * Created by:  rusty.lynch REMOVE-THIS AT intel DOT com
5 * This file is licensed under the GPL license.  For the full content
6 * of this license, see the COPYING file at the top level of this
7 * source tree.
8
9  Test case for assertion #4 of the sigaction system call that shows
10  that attempting to add SIGSTOP can not be added to the signal mask
11  for a signal handler.
12
13  Steps:
14  1. Fork a new process
15  2. (parent) wait for child
16  3. (child) Setup a signal handler for %%MYSIG%% with SIGSTOP added to
17             the signal mask
18  4. (child) raise %%MYSIG%%
19  5. (child, signal handler) raise SIGSTOP
20  5. (child) If still around then return -1
21  6. (parent - returning from wait) If child was stopped then return
22     kill the child and return success, otherwise fail.
23*/
24
25#include <signal.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <sys/wait.h>
29#include <sys/types.h>
30#include <unistd.h>
31#include "posixtest.h"
32
33void handler(int signo)
34{
35	printf("About to stop child\n");
36	raise(SIGSTOP);
37	printf("Child has continued\n");
38	exit(0);
39}
40
41int main()
42{
43	pid_t pid;
44	if ((pid = fork()) == 0) {
45		/* child */
46
47		struct sigaction act;
48
49		act.sa_handler = handler;
50		act.sa_flags = 0;
51		sigemptyset(&act.sa_mask);
52		sigaddset(&act.sa_mask, SIGSTOP);
53		if (sigaction(%%MYSIG%%,  &act, 0) == -1) {
54			perror("Unexpected error while attempting to "
55			       "setup test pre-conditions");
56			return PTS_UNRESOLVED;
57		}
58
59		if (raise(%%MYSIG%%) == -1) {
60			perror("Unexpected error while attempting to "
61			       "setup test pre-conditions");
62		}
63
64		return PTS_UNRESOLVED;
65	} else {
66		int s;
67
68		/* parent */
69		if (waitpid(pid, &s, WUNTRACED) == -1) {
70			perror("Unexpected error while setting up test "
71			       "pre-conditions");
72			return PTS_UNRESOLVED;
73		}
74
75		if (WIFSTOPPED(s)) {
76			printf("Test PASSED\n");
77			kill(pid, SIGKILL);
78			return PTS_PASS;
79		}
80	}
81
82	printf("Test FAILED\n");
83	return PTS_FAIL;
84}
85
86