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 SIGKILL 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 SIGKILL added to 
17             the signal mask
18  4. (child) raise %%MYSIG%%
19  5. (child, signal handler) raise SIGKILL
20  5. (child) If still alive then exit -1
21  6. (parent - returning from wait) If child was killed then return success,
22     otherwise fail.
23*/
24
25#include <signal.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <sys/wait.h>
29#include <unistd.h>
30#include "posixtest.h"
31
32void handler(int signo)
33{
34	raise(SIGKILL);
35	exit(0);
36}
37
38int main()
39{
40	if (fork() == 0) {
41		/* child */
42
43		/* 
44		 * NOTE: This block of code will return 0 for error
45		 *       and anything else for success.
46		 */
47
48		struct sigaction act;
49	
50		act.sa_handler = handler;
51		act.sa_flags = 0;
52		sigemptyset(&act.sa_mask);
53		sigaddset(&act.sa_mask, SIGKILL);
54		if (sigaction(%%MYSIG%%,  &act, 0) == -1) {
55			perror("Unexpected error while attempting to "
56			       "setup test pre-conditions");
57			return PTS_PASS;
58		}
59		
60		if (raise(%%MYSIG%%) == -1) {
61			perror("Unexpected error while attempting to "
62			       "setup test pre-conditions");
63		}
64
65		return PTS_PASS;
66	} else {
67		int s; 
68
69		/* parent */
70		if (wait(&s) == -1) {
71			perror("Unexpected error while setting up test "
72			       "pre-conditions");
73			return PTS_UNRESOLVED;
74		}
75
76		if (!WIFEXITED(s)) {
77			printf("Test PASSED\n");
78			return PTS_PASS;
79		}
80	}
81
82	printf("Test FAILED\n");
83	return PTS_FAIL;	
84}
85
86