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