prctl02.c revision 53740500924f6439623a8ac256b5be2d6c59ed1f
1d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 2d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. 3d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 4d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is free software; you can redistribute it and/or modify it 5d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * under the terms of version 2 of the GNU General Public License as 6d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * published by the Free Software Foundation. 7d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 8d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is distributed in the hope that it would be useful, but 9d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * WITHOUT ANY WARRANTY; without even the implied warranty of 10d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 12d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * You should have received a copy of the GNU General Public License along 13d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * with this program; if not, write the Free Software Foundation, Inc., 59 14d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Temple Place - Suite 330, Boston MA 02111-1307, USA. 15d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 16d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 17d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/********************************************************** 184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 19d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST IDENTIFIER : prctl02 204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 21d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * EXECUTED BY : anyone 224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 23d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST TITLE : Tests for error conditions 244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 25d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST CASE TOTAL : 2 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 27d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * AUTHOR : Saji Kumar.V.R <saji.kumar@wipro.com> 284bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 29d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * SIGNALS 30d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Uses SIGUSR1 to pause before test if option set. 31d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * (See the parse_opts(3) man page). 32d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 33d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * DESCRIPTION 34d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Verify that 35d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 1) prctl() fails with errno, EINVAL when an invalid value is given for 36d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * option 37d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 2) prctl() fails with errno, EINVAL when option is PR_SET_PDEATHSIG 38d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * & arg2 is not zero or a valid signal number 394bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 40d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Setup: 41d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Setup signal handling. 42d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Pause for SIGUSR1 if option specified. 434bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 44d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Test: 45d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Loop if the proper options are given. 46d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * fork a child 47d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 48d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * CHILD: 49d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * call prctl() with proper arguments 50d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * If call fails with expected errno, 51d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * exit with 0 52d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * else 53d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * exit with 1 54d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * PARENT: 55d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * wait() for child. 56d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * If child exits with exit value 0, 57d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Test passed 58d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * else 59d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Test Failed 60bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak * 61d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Cleanup: 62d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Print errno log and/or timing stats if options given 634bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 64d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * USAGE: <for command-line> 65d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * prctl02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p] 66d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * where, -c n : Run n copies concurrently. 67d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -e : Turn on errno logging. 68d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -h : Show help screen 69d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -f : Turn off functional testing 70d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -i n : Execute test n times. 71d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -I x : Execute test for x seconds. 72d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -p : Pause for SIGUSR1 before starting 73d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -P x : Pause for x seconds between iterations. 74d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -t : Turn on syscall timing. 75d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 76d13d74bbf207c2d01598c6fef092a75b93b07c71vapier ****************************************************************/ 77d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 78d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <errno.h> 79d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <signal.h> 80d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/prctl.h> 81d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/wait.h> 82d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 83d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "test.h" 84d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "usctest.h" 85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define OPTION_INVALID 999 87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define INVALID_ARG 999 88d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 89d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void setup(void); 90d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void cleanup(void); 91d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 92d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar *TCID = "prctl02"; /* Test program identifier. */ 93d13d74bbf207c2d01598c6fef092a75b93b07c71vapierextern int Tst_count; /* Test Case counter for tst_* routines */ 9456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic int exp_enos[] = { EINVAL, EINVAL, 0 }; 95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 96d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct test_cases_t { 97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int option; 98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier unsigned long arg2; 99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int exp_errno; 100d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} test_cases[] = { 10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak OPTION_INVALID, 0, EINVAL}, { 10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PR_SET_PDEATHSIG, INVALID_ARG, EINVAL} 104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier}; 105bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 106d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]); 107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int lc, i; /* loop counter */ 112d13d74bbf207c2d01598c6fef092a75b93b07c71vapier char *msg; /* message returned from parse_opts */ 113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier pid_t child_pid; 114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int status; 115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* parse standard options */ 11753740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper<<<<<<< HEAD 11845e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper if ((msg = parse_opts(ac, av, NULL, NULL)) 11945e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper != NULL) { 12060fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 12153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper======= 12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((msg = parse_opts(ac, av, (option_t *) NULL, NULL)) 12343088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper != NULL) { 12453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 12553740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper>>>>>>> master 126d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* perform global setup for test */ 129d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 130d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 131d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* check looping state if -i option given */ 132d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 133d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* reset Tst_count in case we are looping. */ 135d13d74bbf207c2d01598c6fef092a75b93b07c71vapier Tst_count = 0; 136d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (i = 0; i < TST_TOTAL; ++i) { 138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 139ed06ca62aea8ff284a88e4848bceb274ce20e708mridge switch (child_pid = FORK_OR_VFORK()) { 140d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 141d13d74bbf207c2d01598c6fef092a75b93b07c71vapier case -1: 142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* fork() failed */ 143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "fork() failed"); 144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier case 0: 147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Child */ 148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST(prctl(test_cases[i].option, 150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier test_cases[i].arg2)); 151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((TEST_RETURN == -1) && (TEST_ERRNO == 15256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak test_cases[i]. 15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak exp_errno)) { 154d13d74bbf207c2d01598c6fef092a75b93b07c71vapier exit(TEST_ERRNO); 155d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 156923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak tst_resm(TWARN|TTERRNO, "prctl() returned %ld", 157923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak TEST_RETURN); 158d13d74bbf207c2d01598c6fef092a75b93b07c71vapier exit(TEST_ERRNO); 159d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 160d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 161d13d74bbf207c2d01598c6fef092a75b93b07c71vapier default: 162d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Parent */ 163d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((waitpid(child_pid, &status, 0)) < 0) { 164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "waitpid() failed"); 165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 166d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 167d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 168d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((WIFEXITED(status)) && (WEXITSTATUS(status) 16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak == test_cases[i]. 17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak exp_errno)) { 171d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "Test Passed"); 172d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 173d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "Test Failed"); 174d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 175d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_ERROR_LOG(WEXITSTATUS(status)); 176d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 177d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 178d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 17956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } /* End for TEST_LOOPING */ 180d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 181d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* cleanup and exit */ 182d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 183d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 18453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_exit(); 185d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak} /* End main */ 187d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 188d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* setup() - performs all ONE TIME setup for this test */ 18956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 190d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 191d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 192d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* capture signals */ 193d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(FORK, DEF_HANDLER, cleanup); 194bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 195d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* set the expected errnos... */ 196d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_EXP_ENOS(exp_enos); 197d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 198d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Pause if that option was specified */ 199d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 200d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 20156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak} /* End setup() */ 202d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 203d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 204d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *cleanup() - performs all ONE TIME cleanup for this test at 205d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * completion or premature exit. 206d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 20756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 208d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 209d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 210d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* 211d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print timing stats if that option was specified. 212d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print errno log if that option was specified. 213d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 214d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_CLEANUP; 215d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 216d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* exit with return code appropriate for results */ 217d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_exit(); 21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak} /* End cleanup() */ 219