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
637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman * of this license, see the COPYING file at the top level of this
70dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree.
80dc076565f772bb1953209fb69ea150b494aaa40robbiew
90dc076565f772bb1953209fb69ea150b494aaa40robbiew  Test case for assertion #4 of the sigaction system call that shows
100dc076565f772bb1953209fb69ea150b494aaa40robbiew  that attempting to add SIGSTOP can not be added to the signal mask
110dc076565f772bb1953209fb69ea150b494aaa40robbiew  for a signal handler.
120dc076565f772bb1953209fb69ea150b494aaa40robbiew
130dc076565f772bb1953209fb69ea150b494aaa40robbiew  Steps:
140dc076565f772bb1953209fb69ea150b494aaa40robbiew  1. Fork a new process
150dc076565f772bb1953209fb69ea150b494aaa40robbiew  2. (parent) wait for child
1637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman  3. (child) Setup a signal handler for %%MYSIG%% with SIGSTOP added to
170dc076565f772bb1953209fb69ea150b494aaa40robbiew             the signal mask
180dc076565f772bb1953209fb69ea150b494aaa40robbiew  4. (child) raise %%MYSIG%%
190dc076565f772bb1953209fb69ea150b494aaa40robbiew  5. (child, signal handler) raise SIGSTOP
200dc076565f772bb1953209fb69ea150b494aaa40robbiew  5. (child) If still around then return -1
2137550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman  6. (parent - returning from wait) If child was stopped then return
220dc076565f772bb1953209fb69ea150b494aaa40robbiew     kill the child and return success, otherwise fail.
230dc076565f772bb1953209fb69ea150b494aaa40robbiew*/
240dc076565f772bb1953209fb69ea150b494aaa40robbiew
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/wait.h>
290dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h>
300dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
310dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
320dc076565f772bb1953209fb69ea150b494aaa40robbiew
330dc076565f772bb1953209fb69ea150b494aaa40robbiewvoid handler(int signo)
340dc076565f772bb1953209fb69ea150b494aaa40robbiew{
350dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("About to stop child\n");
360dc076565f772bb1953209fb69ea150b494aaa40robbiew	raise(SIGSTOP);
370dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Child has continued\n");
380dc076565f772bb1953209fb69ea150b494aaa40robbiew	exit(0);
390dc076565f772bb1953209fb69ea150b494aaa40robbiew}
400dc076565f772bb1953209fb69ea150b494aaa40robbiew
410dc076565f772bb1953209fb69ea150b494aaa40robbiewint main()
420dc076565f772bb1953209fb69ea150b494aaa40robbiew{
430dc076565f772bb1953209fb69ea150b494aaa40robbiew	pid_t pid;
440dc076565f772bb1953209fb69ea150b494aaa40robbiew	if ((pid = fork()) == 0) {
450dc076565f772bb1953209fb69ea150b494aaa40robbiew		/* child */
460dc076565f772bb1953209fb69ea150b494aaa40robbiew
470dc076565f772bb1953209fb69ea150b494aaa40robbiew		struct sigaction act;
4837550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
490dc076565f772bb1953209fb69ea150b494aaa40robbiew		act.sa_handler = handler;
500dc076565f772bb1953209fb69ea150b494aaa40robbiew		act.sa_flags = 0;
510dc076565f772bb1953209fb69ea150b494aaa40robbiew		sigemptyset(&act.sa_mask);
520dc076565f772bb1953209fb69ea150b494aaa40robbiew		sigaddset(&act.sa_mask, SIGSTOP);
530dc076565f772bb1953209fb69ea150b494aaa40robbiew		if (sigaction(%%MYSIG%%,  &act, 0) == -1) {
540dc076565f772bb1953209fb69ea150b494aaa40robbiew			perror("Unexpected error while attempting to "
550dc076565f772bb1953209fb69ea150b494aaa40robbiew			       "setup test pre-conditions");
560dc076565f772bb1953209fb69ea150b494aaa40robbiew			return PTS_UNRESOLVED;
570dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
5837550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
590dc076565f772bb1953209fb69ea150b494aaa40robbiew		if (raise(%%MYSIG%%) == -1) {
600dc076565f772bb1953209fb69ea150b494aaa40robbiew			perror("Unexpected error while attempting to "
610dc076565f772bb1953209fb69ea150b494aaa40robbiew			       "setup test pre-conditions");
620dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
630dc076565f772bb1953209fb69ea150b494aaa40robbiew
640dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
650dc076565f772bb1953209fb69ea150b494aaa40robbiew	} else {
6637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman		int s;
670dc076565f772bb1953209fb69ea150b494aaa40robbiew
680dc076565f772bb1953209fb69ea150b494aaa40robbiew		/* parent */
690dc076565f772bb1953209fb69ea150b494aaa40robbiew		if (waitpid(pid, &s, WUNTRACED) == -1) {
700dc076565f772bb1953209fb69ea150b494aaa40robbiew			perror("Unexpected error while setting up test "
710dc076565f772bb1953209fb69ea150b494aaa40robbiew			       "pre-conditions");
720dc076565f772bb1953209fb69ea150b494aaa40robbiew			return PTS_UNRESOLVED;
730dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
740dc076565f772bb1953209fb69ea150b494aaa40robbiew
750dc076565f772bb1953209fb69ea150b494aaa40robbiew		if (WIFSTOPPED(s)) {
760dc076565f772bb1953209fb69ea150b494aaa40robbiew			printf("Test PASSED\n");
770dc076565f772bb1953209fb69ea150b494aaa40robbiew			kill(pid, SIGKILL);
780dc076565f772bb1953209fb69ea150b494aaa40robbiew			return PTS_PASS;
790dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
800dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
810dc076565f772bb1953209fb69ea150b494aaa40robbiew
820dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Test FAILED\n");
8337550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman	return PTS_FAIL;
840dc076565f772bb1953209fb69ea150b494aaa40robbiew}
850dc076565f772bb1953209fb69ea150b494aaa40robbiew
86