summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc/sys/t_wait_noproc.c
diff options
context:
space:
mode:
authorcvs2svn <admin@example.com>2025-04-14 17:32:06 +0000
committercvs2svn <admin@example.com>2025-04-14 17:32:06 +0000
commiteb8dd9dca1228af0cd132f515509051ecfabf6f6 (patch)
treeedb6da6af7e865d488dc1a29309f1e1ec226e603 /src/regress/lib/libc/sys/t_wait_noproc.c
parent247f0352e0ed72a4f476db9dc91f4d982bc83eb2 (diff)
downloadopenbsd-tb_20250414.tar.gz
openbsd-tb_20250414.tar.bz2
openbsd-tb_20250414.zip
This commit was manufactured by cvs2git to create tag 'tb_20250414'.tb_20250414
Diffstat (limited to 'src/regress/lib/libc/sys/t_wait_noproc.c')
-rw-r--r--src/regress/lib/libc/sys/t_wait_noproc.c355
1 files changed, 0 insertions, 355 deletions
diff --git a/src/regress/lib/libc/sys/t_wait_noproc.c b/src/regress/lib/libc/sys/t_wait_noproc.c
deleted file mode 100644
index 8d408041c5..0000000000
--- a/src/regress/lib/libc/sys/t_wait_noproc.c
+++ /dev/null
@@ -1,355 +0,0 @@
1/* $OpenBSD: t_wait_noproc.c,v 1.4 2022/12/19 22:44:54 guenther Exp $ */
2/* $NetBSD: t_wait_noproc.c,v 1.5 2016/11/09 17:50:19 kamil Exp $ */
3
4/*-
5 * Copyright (c) 2016 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include "macros.h"
31
32#include <sys/wait.h>
33#include <sys/resource.h>
34
35#include <errno.h>
36#include <stdio.h>
37
38#include "atf-c.h"
39
40#ifndef TWAIT_OPTION
41#define TWAIT_OPTION 0
42#endif
43
44#if TWAIT_OPTION == 0
45ATF_TC(wait);
46ATF_TC_HEAD(wait, tc)
47{
48 atf_tc_set_md_var(tc, "descr",
49 "Test that wait(2) returns ECHILD for no child");
50}
51
52ATF_TC_BODY(wait, tc)
53{
54 ATF_REQUIRE_ERRNO(ECHILD, wait(NULL) == -1);
55}
56#endif
57
58ATF_TC(waitpid);
59ATF_TC_HEAD(waitpid, tc)
60{
61 atf_tc_set_md_var(tc, "descr",
62 "Test that waitpid(2) returns ECHILD for WAIT_ANY and option %s",
63 ___STRING(TWAIT_OPTION));
64}
65
66ATF_TC_BODY(waitpid, tc)
67{
68 ATF_REQUIRE_ERRNO(ECHILD, waitpid(WAIT_ANY, NULL, TWAIT_OPTION) == -1);
69}
70
71ATF_TC(waitid);
72ATF_TC_HEAD(waitid, tc)
73{
74 atf_tc_set_md_var(tc, "descr",
75 "Test that waitid(2) returns ECHILD for P_ALL and option %s",
76 ___STRING(TWAIT_OPTION));
77}
78
79ATF_TC_BODY(waitid, tc)
80{
81 ATF_REQUIRE_ERRNO(ECHILD,
82 waitid(P_ALL, 0, NULL,
83 WEXITED | TWAIT_OPTION) == -1);
84}
85
86ATF_TC(wait3);
87ATF_TC_HEAD(wait3, tc)
88{
89 atf_tc_set_md_var(tc, "descr",
90 "Test that wait3(2) returns ECHILD for no child");
91}
92
93ATF_TC_BODY(wait3, tc)
94{
95 ATF_REQUIRE_ERRNO(ECHILD, wait3(NULL, TWAIT_OPTION, NULL) == -1);
96}
97
98ATF_TC(wait4);
99ATF_TC_HEAD(wait4, tc)
100{
101 atf_tc_set_md_var(tc, "descr",
102 "Test that wait4(2) returns ECHILD for WAIT_ANY and option %s",
103 ___STRING(TWAIT_OPTION));
104}
105
106ATF_TC_BODY(wait4, tc)
107{
108 ATF_REQUIRE_ERRNO(ECHILD,
109 wait4(WAIT_ANY, NULL, TWAIT_OPTION, NULL) == -1);
110}
111
112#ifndef __OpenBSD__
113 * Adjusted for OpenBSD, not available
114 * ATF_TC(wait6);
115 * ATF_TC_HEAD(wait6, tc)
116 * {
117 * atf_tc_set_md_var(tc, "descr",
118 * "Test that wait6(2) returns ECHILD for P_ALL and option %s",
119 * ___STRING(TWAIT_OPTION));
120 * }
121 *
122 * ATF_TC_BODY(wait6, tc)
123 * {
124 * ATF_REQUIRE_ERRNO(ECHILD,
125 * wait6(P_ALL, 0, NULL,
126 * WTRAPPED | WEXITED | TWAIT_OPTION, NULL, NULL) == -1);
127 * }
128 */
129#endif
130
131/*
132 * Generator of valid combinations of options
133 * Usage: i = 0; while ((o = get_options_wait6(i++)) != -1) {}
134 */
135static int
136get_options6(size_t pos)
137{
138 int rv = 0;
139 size_t n;
140 /*
141 * waitid(2) must specify at least one of WEXITED, WUNTRACED,
142 * WSTOPPED, WTRAPPED or WCONTINUED. Single option WNOWAIT
143 * isn't valid.
144 */
145 const int matrix[] = {
146 WNOWAIT, // First in order to blacklist it easily
147 WEXITED,
148#ifndef __OpenBSD__
149 WUNTRACED,
150#endif
151 WSTOPPED, // SUS compatibility, equal to WUNTRACED
152 WTRAPPED,
153 WCONTINUED
154 };
155
156 const size_t M = (1 << __arraycount(matrix)) - 1;
157 /* Skip empty and sole WNOWAIT option */
158 pos+=2;
159
160 if (pos > M)
161 return -1;
162
163 for (n = 0; n < __arraycount(matrix); n++) {
164 if (pos & __BIT(n))
165 rv |= matrix[n];
166 }
167
168 return rv;
169}
170
171/*
172 * Generator of valid combinations of options
173 * Usage: i = 0; while ((o = get_options_wait4(i++)) != -1) {}
174 */
175static int
176get_options4(size_t pos)
177{
178 int rv = 0;
179 size_t n;
180
181 const int special[] = {
182 0,
183#ifndef __OpenBSD__
184 WALLSIG,
185 WALTSIG,
186 __WALL, // Linux compatibility, equal to WALLSIG
187 __WCLONE // Linux compatibility, equal to WALTSIG
188#endif
189 };
190
191 const int matrix[] = {
192#ifndef __OpenBSD__
193 WNOWAIT,
194 WEXITED,
195#endif
196 WUNTRACED,
197#ifndef __OpenBSD__
198 WSTOPPED, // SUS compatibility, equal to WUNTRACED
199 WTRAPPED,
200#endif
201 WCONTINUED
202 };
203
204 const size_t M = (1 << __arraycount(special)) - 1;
205
206 if (pos < __arraycount(special))
207 return special[pos];
208
209 pos -= __arraycount(special);
210
211 ++pos; /* Don't start with empty mask */
212
213 if (pos > M)
214 return -1;
215
216 for (n = 0; n < __arraycount(special); n++) {
217 if (pos & __BIT(n))
218 rv |= matrix[n];
219 }
220
221 return rv;
222}
223
224ATF_TC(waitpid_options);
225ATF_TC_HEAD(waitpid_options, tc)
226{
227 atf_tc_set_md_var(tc, "descr",
228 "Test that waitpid(2) returns ECHILD for WAIT_ANY and valid "
229 "combination of options with%s WNOHANG",
230 TWAIT_OPTION == 0 ? "out" : "");
231}
232
233ATF_TC_BODY(waitpid_options, tc)
234{
235 size_t i = 0;
236 int o;
237
238 while((o = get_options4(i++)) != -1) {
239 printf("Testing waitpid(2) with options %x\n", o);
240
241 ATF_REQUIRE_ERRNO(ECHILD,
242 waitpid(WAIT_ANY, NULL, o | TWAIT_OPTION) == -1);
243 }
244}
245
246ATF_TC(waitid_options);
247ATF_TC_HEAD(waitid_options, tc)
248{
249 atf_tc_set_md_var(tc, "descr",
250 "Test that waitid(2) returns ECHILD for P_ALL and valid "
251 "combination of options with%s WNOHANG",
252 TWAIT_OPTION == 0 ? "out" : "");
253}
254
255ATF_TC_BODY(waitid_options, tc)
256{
257 size_t i = 0;
258 int o;
259
260 while((o = get_options6(i++)) != -1) {
261 printf("Testing waitid(2) with options %x\n", o);
262
263 ATF_REQUIRE_ERRNO(ECHILD,
264 waitid(P_ALL, 0, NULL, o | TWAIT_OPTION) == -1);
265 }
266}
267
268ATF_TC(wait3_options);
269ATF_TC_HEAD(wait3_options, tc)
270{
271 atf_tc_set_md_var(tc, "descr",
272 "Test that wait3(2) returns ECHILD for no child");
273}
274
275ATF_TC_BODY(wait3_options, tc)
276{
277 size_t i = 0;
278 int o;
279
280 while((o = get_options4(i++)) != -1) {
281 printf("Testing wait3(2) with options %x\n", o);
282
283 ATF_REQUIRE_ERRNO(ECHILD,
284 wait3(NULL, o | TWAIT_OPTION, NULL) == -1);
285 }
286}
287
288ATF_TC(wait4_options);
289ATF_TC_HEAD(wait4_options, tc)
290{
291 atf_tc_set_md_var(tc, "descr",
292 "Test that wait4(2) returns ECHILD for WAIT_ANY and option %s",
293 ___STRING(TWAIT_OPTION));
294}
295
296ATF_TC_BODY(wait4_options, tc)
297{
298 size_t i = 0;
299 int o;
300
301 while((o = get_options4(i++)) != -1) {
302 printf("Testing wait4(2) with options %x\n", o);
303
304 ATF_REQUIRE_ERRNO(ECHILD,
305 wait4(WAIT_ANY, NULL, o | TWAIT_OPTION, NULL) == -1);
306 }
307}
308
309#ifndef __OpenBSD__
310ATF_TC(wait6_options);
311ATF_TC_HEAD(wait6_options, tc)
312{
313 atf_tc_set_md_var(tc, "descr",
314 "Test that wait6(2) returns ECHILD for P_ALL and option %s",
315 ___STRING(TWAIT_OPTION));
316}
317
318ATF_TC_BODY(wait6_options, tc)
319{
320 size_t i = 0;
321 int o;
322
323 while((o = get_options6(i++)) != -1) {
324 printf("Testing wait6(2) with options %x\n", o);
325
326 ATF_REQUIRE_ERRNO(ECHILD,
327 wait6(P_ALL, 0, NULL, o | TWAIT_OPTION, NULL, NULL) == -1);
328 }
329}
330#endif
331
332ATF_TP_ADD_TCS(tp)
333{
334
335#if TWAIT_OPTION == 0
336 ATF_TP_ADD_TC(tp, wait);
337#endif
338 ATF_TP_ADD_TC(tp, waitpid);
339 ATF_TP_ADD_TC(tp, waitid);
340 ATF_TP_ADD_TC(tp, wait3);
341 ATF_TP_ADD_TC(tp, wait4);
342#ifndef __OpenBSD__
343 ATF_TP_ADD_TC(tp, wait6);
344#endif
345
346 ATF_TP_ADD_TC(tp, waitpid_options);
347 ATF_TP_ADD_TC(tp, waitid_options);
348 ATF_TP_ADD_TC(tp, wait3_options);
349 ATF_TP_ADD_TC(tp, wait4_options);
350#ifndef __OpenBSD__
351 ATF_TP_ADD_TC(tp, wait6_options);
352#endif
353
354 return atf_no_error();
355}