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 #12 of the sigaction system call that verifies
100dc076565f772bb1953209fb69ea150b494aaa40robbiew  signal-catching functions are executed on the alternate stack if the
110dc076565f772bb1953209fb69ea150b494aaa40robbiew  SA_ONSTACK flag is set in the sigaction.sa_flags parameter to the
122c28215423293e443469a07ae7011135d058b671Garrett Cooper  sigaction function call, and an alternate stack has been setup with
130dc076565f772bb1953209fb69ea150b494aaa40robbiew  sigaltstack().
140dc076565f772bb1953209fb69ea150b494aaa40robbiew
150dc076565f772bb1953209fb69ea150b494aaa40robbiew  NOTE: This test case does not attempt to verify the proper operation
160dc076565f772bb1953209fb69ea150b494aaa40robbiew        of sigaltstack.
170dc076565f772bb1953209fb69ea150b494aaa40robbiew*/
180dc076565f772bb1953209fb69ea150b494aaa40robbiew
190dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
200dc076565f772bb1953209fb69ea150b494aaa40robbiew
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h>
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
250dc076565f772bb1953209fb69ea150b494aaa40robbiew
260dc076565f772bb1953209fb69ea150b494aaa40robbiewstack_t alt_ss;
270dc076565f772bb1953209fb69ea150b494aaa40robbiew
280dc076565f772bb1953209fb69ea150b494aaa40robbiewvoid handler(int signo)
290dc076565f772bb1953209fb69ea150b494aaa40robbiew{
300dc076565f772bb1953209fb69ea150b494aaa40robbiew	stack_t ss;
310dc076565f772bb1953209fb69ea150b494aaa40robbiew
320dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Caught SIGABRT\n");
330dc076565f772bb1953209fb69ea150b494aaa40robbiew
344e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (sigaltstack(NULL, &ss) == -1) {
350dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
360dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
370dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(-1);
380dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
392c28215423293e443469a07ae7011135d058b671Garrett Cooper
400dc076565f772bb1953209fb69ea150b494aaa40robbiew	if (ss.ss_sp != alt_ss.ss_sp || ss.ss_size != alt_ss.ss_size) {
410dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("Test FAILED\n");
420dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(-1);
430dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
440dc076565f772bb1953209fb69ea150b494aaa40robbiew}
450dc076565f772bb1953209fb69ea150b494aaa40robbiew
464ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
470dc076565f772bb1953209fb69ea150b494aaa40robbiew{
480dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct sigaction act;
492c28215423293e443469a07ae7011135d058b671Garrett Cooper
500dc076565f772bb1953209fb69ea150b494aaa40robbiew	act.sa_handler = handler;
510dc076565f772bb1953209fb69ea150b494aaa40robbiew	act.sa_flags = SA_ONSTACK;
520dc076565f772bb1953209fb69ea150b494aaa40robbiew	sigemptyset(&act.sa_mask);
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sigaction(SIGABRT, &act, 0) == -1) {
540dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
550dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
560dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
570dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
580dc076565f772bb1953209fb69ea150b494aaa40robbiew
59d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	if ((alt_ss.ss_sp = malloc(SIGSTKSZ)) == NULL) {
600dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
610dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
620dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
630dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
640dc076565f772bb1953209fb69ea150b494aaa40robbiew	alt_ss.ss_size = SIGSTKSZ;
650dc076565f772bb1953209fb69ea150b494aaa40robbiew	alt_ss.ss_flags = 0;
662c28215423293e443469a07ae7011135d058b671Garrett Cooper
674e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (sigaltstack(&alt_ss, NULL) == -1) {
680dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
690dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
700dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
710dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
720dc076565f772bb1953209fb69ea150b494aaa40robbiew
730dc076565f772bb1953209fb69ea150b494aaa40robbiew	if (raise(SIGABRT) == -1) {
740dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("Unexpected error while attempting to setup test "
750dc076565f772bb1953209fb69ea150b494aaa40robbiew		       "pre-conditions");
760dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
770dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
780dc076565f772bb1953209fb69ea150b494aaa40robbiew
790dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Test PASSED\n");
802c28215423293e443469a07ae7011135d058b671Garrett Cooper	return PTS_PASS;
81ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
82