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
13fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc.,
14fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
602c28215423293e443469a07ae7011135d058b671Garrett Cooper *
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
85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define OPTION_INVALID 999
86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define INVALID_ARG 999
87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
88d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void setup(void);
89d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void cleanup(void);
90d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
91fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "prctl02";
92d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
93d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct test_cases_t {
94d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int option;
95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	unsigned long arg2;
96d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int exp_errno;
97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} test_cases[] = {
9856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	{
9956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	OPTION_INVALID, 0, EINVAL}, {
10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	PR_SET_PDEATHSIG, INVALID_ARG, EINVAL}
101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier};
102bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
103d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]);
104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
10556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
106d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
10889af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc, i;
109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	pid_t child_pid;
110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int status;
111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
112d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	setup();
115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	for (lc = 0; TEST_LOOPING(lc); lc++) {
117d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
118d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
119d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		for (i = 0; i < TST_TOTAL; ++i) {
121d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
122ed06ca62aea8ff284a88e4848bceb274ce20e708mridge			switch (child_pid = FORK_OR_VFORK()) {
123d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
124d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			case -1:
125d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				/* fork() failed */
126d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				tst_resm(TFAIL, "fork() failed");
127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				continue;
128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
129d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			case 0:
130d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				/* Child */
131d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
132d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				TEST(prctl(test_cases[i].option,
133d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					   test_cases[i].arg2));
134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if ((TEST_RETURN == -1) && (TEST_ERRNO ==
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    test_cases
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    [i].exp_errno)) {
137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					exit(TEST_ERRNO);
138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					tst_resm(TWARN | TTERRNO,
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						 "prctl() returned %ld",
141923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak						 TEST_RETURN);
142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					exit(TEST_ERRNO);
143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			default:
146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				/* Parent */
147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if ((waitpid(child_pid, &status, 0)) < 0) {
148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					tst_resm(TFAIL, "waitpid() failed");
149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					continue;
150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if ((WIFEXITED(status)) && (WEXITSTATUS(status)
153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    ==
154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    test_cases
155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    [i].exp_errno)) {
156d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					tst_resm(TPASS, "Test Passed");
157d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
158d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					tst_resm(TFAIL, "Test Failed");
159d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
160d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
161d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
162d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
1632c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* cleanup and exit */
166d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	cleanup();
167d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
16853740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
169d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
1702c28215423293e443469a07ae7011135d058b671Garrett Cooper}
171d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
172d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* setup() - performs all ONE TIME setup for this test */
173c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void)
174d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
175d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
176d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	tst_sig(FORK, DEF_HANDLER, cleanup);
177bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
178d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	TEST_PAUSE;
179d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
1802c28215423293e443469a07ae7011135d058b671Garrett Cooper}
181d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
182d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
183d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *cleanup() -  performs all ONE TIME cleanup for this test at
184d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *		completion or premature exit.
185d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
186c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
187d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
188d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
189ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
190