summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc/sys/t_pipe2.c
diff options
context:
space:
mode:
authorbluhm <>2019-11-19 19:57:04 +0000
committerbluhm <>2019-11-19 19:57:04 +0000
commit9185f840eda265016178aeb0dcdba964f8f6f3e2 (patch)
treeda100b3712514c566fe948116f7926ad7f725401 /src/regress/lib/libc/sys/t_pipe2.c
parent6a6fe688152b422f3d65c970dad56e7d9d28b1ee (diff)
downloadopenbsd-9185f840eda265016178aeb0dcdba964f8f6f3e2.tar.gz
openbsd-9185f840eda265016178aeb0dcdba964f8f6f3e2.tar.bz2
openbsd-9185f840eda265016178aeb0dcdba964f8f6f3e2.zip
Import NetBSD system call regression tests. They were written with
ATF (Automated Testing Framework), so we use a small wrapper to map it to our bsd.regress.mk framework. Only half of the 80 NetBSD tests have been taken, the others need more work to adapt. Of them 34 syscall tests pass. Moritz Buhl ported the tests to OpenBSD.
Diffstat (limited to 'src/regress/lib/libc/sys/t_pipe2.c')
-rw-r--r--src/regress/lib/libc/sys/t_pipe2.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/regress/lib/libc/sys/t_pipe2.c b/src/regress/lib/libc/sys/t_pipe2.c
new file mode 100644
index 0000000000..4964be14ce
--- /dev/null
+++ b/src/regress/lib/libc/sys/t_pipe2.c
@@ -0,0 +1,203 @@
1/* $OpenBSD: t_pipe2.c,v 1.1.1.1 2019/11/19 19:57:04 bluhm Exp $ */
2/* $NetBSD: t_pipe2.c,v 1.9 2017/01/13 21:19:45 christos Exp $ */
3
4/*-
5 * Copyright (c) 2011 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Christos Zoulas.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the NetBSD
22 * Foundation, Inc. and its contributors.
23 * 4. Neither the name of The NetBSD Foundation nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40#include "macros.h"
41
42#include <sys/cdefs.h>
43__RCSID("$NetBSD: t_pipe2.c,v 1.9 2017/01/13 21:19:45 christos Exp $");
44
45#include "atf-c.h"
46#include <fcntl.h>
47#include <unistd.h>
48#include <stdlib.h>
49#include <errno.h>
50#include <sys/resource.h>
51
52static void
53run(int flags)
54{
55 int fd[2], i;
56
57 while ((i = open("/", O_RDONLY)) < 3)
58 ATF_REQUIRE(i != -1);
59
60 ATF_REQUIRE_MSG(closefrom(3) != -1, "closefrom failed: %s",
61 strerror(errno));
62
63 ATF_REQUIRE(pipe2(fd, flags) == 0);
64
65 ATF_REQUIRE(fd[0] == 3);
66 ATF_REQUIRE(fd[1] == 4);
67
68 if (flags & O_CLOEXEC) {
69 ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) != 0);
70 ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) != 0);
71 } else {
72 ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) == 0);
73 ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) == 0);
74 }
75
76 if (flags & O_NONBLOCK) {
77 ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) != 0);
78 ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) != 0);
79 } else {
80 ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) == 0);
81 ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) == 0);
82 }
83
84 /*
85 * Adjusted for OpenBSD, not available
86 * if (flags & O_NOSIGPIPE) {
87 * ATF_REQUIRE(fcntl(fd[0], F_GETNOSIGPIPE) != 0);
88 * ATF_REQUIRE(fcntl(fd[1], F_GETNOSIGPIPE) != 0);
89 *} else {
90 * ATF_REQUIRE(fcntl(fd[0], F_GETNOSIGPIPE) == 0);
91 * ATF_REQUIRE(fcntl(fd[1], F_GETNOSIGPIPE) == 0);
92 *}
93 */
94
95 ATF_REQUIRE(close(fd[0]) != -1);
96 ATF_REQUIRE(close(fd[1]) != -1);
97}
98
99ATF_TC(pipe2_basic);
100ATF_TC_HEAD(pipe2_basic, tc)
101{
102 atf_tc_set_md_var(tc, "descr", "A basic test of pipe2(2)");
103}
104
105ATF_TC_BODY(pipe2_basic, tc)
106{
107 run(0);
108}
109
110ATF_TC(pipe2_consume);
111ATF_TC_HEAD(pipe2_consume, tc)
112{
113 atf_tc_set_md_var(tc, "descr", "Test that consuming file descriptors "
114 "with pipe2(2) does not crash the system (PR kern/46457)");
115}
116
117ATF_TC_BODY(pipe2_consume, tc)
118{
119 struct rlimit rl;
120 int err, filedes[2];
121 int old;
122
123 ATF_REQUIRE_MSG(closefrom(4) != -1, "closefrom failed: %s",
124 strerror(errno));
125
126 err = getrlimit(RLIMIT_NOFILE, &rl);
127 ATF_REQUIRE(err == 0);
128 /*
129 * The heart of this test is to run against the number of open
130 * file descriptor limit in the middle of a pipe2() call - i.e.
131 * before the call only a single descriptor may be openend.
132 */
133 old = rl.rlim_cur;
134 rl.rlim_cur = 4;
135 err = setrlimit(RLIMIT_NOFILE, &rl);
136 ATF_REQUIRE(err == 0);
137
138 err = pipe2(filedes, O_CLOEXEC);
139 ATF_REQUIRE(err == -1);
140 rl.rlim_cur = old;
141 err = setrlimit(RLIMIT_NOFILE, &rl);
142}
143
144ATF_TC(pipe2_nonblock);
145ATF_TC_HEAD(pipe2_nonblock, tc)
146{
147 atf_tc_set_md_var(tc, "descr", "A non-blocking test of pipe2(2)");
148}
149
150ATF_TC_BODY(pipe2_nonblock, tc)
151{
152 run(O_NONBLOCK);
153}
154
155ATF_TC(pipe2_cloexec);
156ATF_TC_HEAD(pipe2_cloexec, tc)
157{
158 atf_tc_set_md_var(tc, "descr", "A close-on-exec test of pipe2(2)");
159}
160
161ATF_TC_BODY(pipe2_cloexec, tc)
162{
163 run(O_CLOEXEC);
164}
165
166ATF_TC(pipe2_nosigpipe);
167ATF_TC_HEAD(pipe2_nosigpipe, tc)
168{
169 atf_tc_set_md_var(tc, "descr", "A no sigpipe test of pipe2(2)");
170}
171
172ATF_TC_BODY(pipe2_nosigpipe, tc)
173{
174 run(O_NOSIGPIPE);
175}
176
177ATF_TC(pipe2_einval);
178ATF_TC_HEAD(pipe2_einval, tc)
179{
180 atf_tc_set_md_var(tc, "descr", "A error check of pipe2(2)");
181}
182
183ATF_TC_BODY(pipe2_einval, tc)
184{
185 int fd[2];
186 ATF_REQUIRE_ERRNO(EINVAL, pipe2(fd, O_ASYNC) == -1);
187}
188
189ATF_TP_ADD_TCS(tp)
190{
191
192 ATF_TP_ADD_TC(tp, pipe2_basic);
193 ATF_TP_ADD_TC(tp, pipe2_consume);
194 ATF_TP_ADD_TC(tp, pipe2_nonblock);
195 ATF_TP_ADD_TC(tp, pipe2_cloexec);
196 /*
197 * Adjusted for OpenBSD, not available
198 * ATF_TP_ADD_TC(tp, pipe2_nosigpipe);
199 */
200 ATF_TP_ADD_TC(tp, pipe2_einval);
201
202 return atf_no_error();
203}