• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 /*
21  * NAME
22  *	waitpid04.c
23  *
24  * DESCRIPTION
25  *	test to check the error conditions in waitpid sys call
26  *
27  * USAGE:  <for command-line>
28  *      waitpid04 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
29  *      where,  -c n : Run n copies concurrently.
30  *              -e   : Turn on errno logging.
31  *              -i n : Execute test n times.
32  *              -I x : Execute test for x seconds.
33  *              -P x : Pause for x seconds between iterations.
34  *              -t   : Turn on syscall timing.
35  *
36  * History
37  *	07/2001 John George
38  *		-Ported
39  *
40  * Restrictions
41  *	NONE
42  */
43 
44 #include <sys/signal.h>
45 #include <sys/types.h>
46 #include <sys/wait.h>
47 #include <errno.h>
48 #include "test.h"
49 
50 static void setup(void);
51 static void cleanup(void);
52 
53 char *TCID = "waitpid04";
54 int TST_TOTAL = 1;
55 
56 #define INVAL_FLAG	-1
57 
58 static int flag, condition_number;
59 
main(int ac,char ** av)60 int main(int ac, char **av)
61 {
62 	int pid, status, ret;
63 
64 	int lc;
65 
66 	tst_parse_opts(ac, av, NULL, NULL);
67 
68 	setup();
69 
70 	/* check for looping state if -i option is given */
71 	for (lc = 0; TEST_LOOPING(lc); lc++) {
72 		/* reset tst_count in case we are looping */
73 		tst_count = 0;
74 
75 		ret = waitpid(pid, &status, WNOHANG);
76 		flag = 0;
77 		condition_number = 1;
78 		if (ret != -1) {
79 			tst_resm(TFAIL, "condition %d test failed",
80 				 condition_number);
81 		} else {
82 			if (errno != ECHILD) {
83 				tst_resm(TFAIL, "waitpid() set invalid "
84 					 "errno, expected ECHILD, got: %d",
85 					 errno);
86 			} else {
87 				tst_resm(TPASS, "condition %d test passed",
88 					 condition_number);
89 			}
90 		}
91 		condition_number++;
92 
93 		if (FORK_OR_VFORK() == 0)
94 			exit(0);
95 
96 		pid = 1;
97 		ret = waitpid(pid, &status, WUNTRACED);
98 		flag = 0;
99 		if (ret != -1) {
100 			tst_resm(TFAIL, "condition %d test failed",
101 				 condition_number);
102 		} else {
103 			if (errno != ECHILD) {
104 				tst_resm(TFAIL, "waitpid() set invalid "
105 					 "errno, expected ECHILD, got: %d",
106 					 errno);
107 			} else {
108 				tst_resm(TPASS, "condition %d test passed",
109 					 condition_number);
110 			}
111 		}
112 		condition_number++;
113 
114 		/* Option is Inval = INVAL_FLAG */
115 		ret = waitpid(pid, &status, INVAL_FLAG);
116 		flag = 0;
117 		if (ret != -1) {
118 			tst_resm(TFAIL, "condition %d test failed",
119 				 condition_number);
120 		} else {
121 			if (errno != EINVAL) {
122 				tst_resm(TFAIL, "waitpid() set invalid "
123 					 "errno, expected EINVAL, got: %d",
124 					 errno);
125 			} else {
126 				tst_resm(TPASS, "condition %d test passed",
127 					 condition_number);
128 			}
129 		}
130 		condition_number++;
131 	}
132 
133 	cleanup();
134 	tst_exit();
135 }
136 
setup(void)137 static void setup(void)
138 {
139 	TEST_PAUSE;
140 }
141 
cleanup(void)142 static void cleanup(void)
143 {
144 }
145