1/*
2 * Copyright (c) 2002, Intel Corporation. All rights reserved.
3 * Created by:  julie.n.fleischer 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 *  Test that the raise(<signal>) function shall send the signal
9 *  to the executing process when the executing process is a child
10 *  process.
11 *  1) Set up a signal handler for a signal in the parent process.
12 *     This handler returns failure if called.
13 *  2) Fork a child process.
14 *  2) In the child process:
15 *     3) Set up a signal handler for the same signal as in the parent process.
16 *        This handler returns success if called.
17 *     4) Raise the signal.
18 *     5) If signal handler was called, return 1 (so WEXITSTATUS can test
19 *        for success).
20 *  6) In parent, if 1 was received, test passed.
21 *  This test is only performed on one signal.  All other signals are
22 *  considered to be in the same equivalence class.
23 */
24
25#include <signal.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <sys/types.h>
29#include <unistd.h>
30#include <sys/wait.h>
31#include "posixtest.h"
32
33#define SIGTOTEST SIGABRT
34
35void parenthandler(int signo)
36{
37	printf("Caught signal from parent!\n");
38	exit(-1);
39}
40
41void childhandler(int signo)
42{
43	printf("Caught signal from child!\n");
44	exit(0);
45}
46
47int main()
48{
49	struct sigaction parentact;
50
51	parentact.sa_handler=parenthandler;
52	parentact.sa_flags=0;
53	if (sigemptyset(&parentact.sa_mask) == -1) {
54		perror("Error calling sigemptyset\n");
55		return PTS_UNRESOLVED;
56	}
57	if (sigaction(SIGTOTEST, &parentact, 0) == -1) {
58		perror("Error calling sigaction\n");
59		return PTS_UNRESOLVED;
60	}
61
62	if (fork() == 0) {
63		/* child here */
64		struct sigaction childact;
65
66		childact.sa_handler=childhandler;
67		childact.sa_flags=0;
68		if (sigemptyset(&childact.sa_mask) == -1) {
69			perror("Error calling sigemptyset\n");
70			return PTS_UNRESOLVED;
71		}
72		if (sigaction(SIGTOTEST, &childact, 0) == -1) {
73			perror("Error calling sigaction\n");
74			return PTS_UNRESOLVED;
75		}
76		if (raise(SIGTOTEST) != 0) {
77			printf("Could not raise signal being tested\n");
78			return PTS_FAIL;
79		}
80
81		printf("Should have exited from signal handler\n");
82		return PTS_FAIL;
83	} else {
84		/* parent here */
85		int i;
86
87		if (wait(&i) == -1) {
88			perror("Error waiting for child to exit\n");
89			return PTS_UNRESOLVED;
90		}
91		if (!WEXITSTATUS(i)) {
92			printf("Child exited normally\n");
93			printf("Test PASSED\n");
94			return PTS_PASS;
95		}
96		else {
97			printf("Child did not exit normally.\n");
98			printf("Test FAILED\n");
99			return PTS_FAIL;
100		}
101	}
102
103	printf("Should not make it here.\n");
104	return PTS_UNRESOLVED;
105}
106
107