10dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew
30dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2002-2003, Intel Corporation. All rights reserved.
40dc076565f772bb1953209fb69ea150b494aaa40robbiew * Created by:  rusty.lynch REMOVE-THIS AT intel DOT com
50dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license.  For the full content
62c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this
70dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree.
80dc076565f772bb1953209fb69ea150b494aaa40robbiew
90dc076565f772bb1953209fb69ea150b494aaa40robbiew  Test case for assertion #13 of the sigaction system call that verifies
100dc076565f772bb1953209fb69ea150b494aaa40robbiew  signal-catching functions are executed on the current stack if the
110dc076565f772bb1953209fb69ea150b494aaa40robbiew  SA_ONSTACK flag is cleared in the sigaction.sa_flags parameter to the
120dc076565f772bb1953209fb69ea150b494aaa40robbiew  sigaction function call.
130dc076565f772bb1953209fb69ea150b494aaa40robbiew
140dc076565f772bb1953209fb69ea150b494aaa40robbiew  NOTE: This test case does not attempt to verify the proper operation
150dc076565f772bb1953209fb69ea150b494aaa40robbiew        of sigaltstack.
160dc076565f772bb1953209fb69ea150b494aaa40robbiew*/
170dc076565f772bb1953209fb69ea150b494aaa40robbiew
180dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
190dc076565f772bb1953209fb69ea150b494aaa40robbiew
200dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h>
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
240dc076565f772bb1953209fb69ea150b494aaa40robbiew
250dc076565f772bb1953209fb69ea150b494aaa40robbiewstack_t current;
260dc076565f772bb1953209fb69ea150b494aaa40robbiew
270dc076565f772bb1953209fb69ea150b494aaa40robbiewvoid handler(int signo)
280dc076565f772bb1953209fb69ea150b494aaa40robbiew{
290dc076565f772bb1953209fb69ea150b494aaa40robbiew	stack_t oss;
300dc076565f772bb1953209fb69ea150b494aaa40robbiew
310dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Caught SIGTRAP\n");
320dc076565f772bb1953209fb69ea150b494aaa40robbiew
334e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (sigaltstack(NULL, &oss) == -1) {
340dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
350dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
360dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(-1);
370dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
382c28215423293e443469a07ae7011135d058b671Garrett Cooper
390dc076565f772bb1953209fb69ea150b494aaa40robbiew	if (oss.ss_sp != current.ss_sp || oss.ss_size != current.ss_size) {
400dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("Test FAILED\n");
410dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(-1);
420dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
430dc076565f772bb1953209fb69ea150b494aaa40robbiew}
440dc076565f772bb1953209fb69ea150b494aaa40robbiew
454ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
460dc076565f772bb1953209fb69ea150b494aaa40robbiew{
470dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct sigaction act;
482c28215423293e443469a07ae7011135d058b671Garrett Cooper
490dc076565f772bb1953209fb69ea150b494aaa40robbiew	act.sa_handler = handler;
500dc076565f772bb1953209fb69ea150b494aaa40robbiew	act.sa_flags = 0;
510dc076565f772bb1953209fb69ea150b494aaa40robbiew	sigemptyset(&act.sa_mask);
52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sigaction(SIGTRAP, &act, 0) == -1) {
530dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
540dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
550dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
560dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
572c28215423293e443469a07ae7011135d058b671Garrett Cooper
584e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (sigaltstack(NULL, &current) == -1) {
590dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
600dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
610dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
620dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
630dc076565f772bb1953209fb69ea150b494aaa40robbiew
640dc076565f772bb1953209fb69ea150b494aaa40robbiew	if (raise(SIGTRAP) == -1) {
650dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
660dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
670dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
680dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
690dc076565f772bb1953209fb69ea150b494aaa40robbiew
700dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Test PASSED\n");
712c28215423293e443469a07ae7011135d058b671Garrett Cooper	return PTS_PASS;
72ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
73