summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc/sys/t_socketpair.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_socketpair.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_socketpair.c')
-rw-r--r--src/regress/lib/libc/sys/t_socketpair.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/regress/lib/libc/sys/t_socketpair.c b/src/regress/lib/libc/sys/t_socketpair.c
new file mode 100644
index 0000000000..076d2fa057
--- /dev/null
+++ b/src/regress/lib/libc/sys/t_socketpair.c
@@ -0,0 +1,141 @@
1/* $OpenBSD: t_socketpair.c,v 1.1.1.1 2019/11/19 19:57:04 bluhm Exp $ */
2/* $NetBSD: t_socketpair.c,v 1.2 2017/01/13 20:04:52 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_socketpair.c,v 1.2 2017/01/13 20:04:52 christos Exp $");
44
45#include "atf-c.h"
46#include <fcntl.h>
47#include <unistd.h>
48#include <stdlib.h>
49#include <sys/socket.h>
50#include <sys/un.h>
51#include <errno.h>
52
53static void
54connected(int fd)
55{
56 struct sockaddr_un addr;
57 socklen_t len = (socklen_t)sizeof(addr);
58 ATF_REQUIRE(getpeername(fd, (struct sockaddr*)(void *)&addr,
59 &len) == 0);
60}
61
62static void
63run(int flags)
64{
65 int fd[2], i;
66
67 while ((i = open("/", O_RDONLY)) < 3)
68 ATF_REQUIRE(i != -1);
69
70 ATF_REQUIRE(closefrom(3) != -1);
71
72 ATF_REQUIRE(socketpair(AF_UNIX, SOCK_DGRAM | flags, 0, fd) == 0);
73
74 ATF_REQUIRE(fd[0] == 3);
75 ATF_REQUIRE(fd[1] == 4);
76
77 connected(fd[0]);
78 connected(fd[1]);
79
80 if (flags & SOCK_CLOEXEC) {
81 ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) != 0);
82 ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) != 0);
83 } else {
84 ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) == 0);
85 ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) == 0);
86 }
87
88 if (flags & SOCK_NONBLOCK) {
89 ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) != 0);
90 ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) != 0);
91 } else {
92 ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) == 0);
93 ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) == 0);
94 }
95
96 ATF_REQUIRE(close(fd[0]) != -1);
97 ATF_REQUIRE(close(fd[1]) != -1);
98}
99
100ATF_TC(socketpair_basic);
101ATF_TC_HEAD(socketpair_basic, tc)
102{
103 atf_tc_set_md_var(tc, "descr", "A basic test of socketpair(2)");
104}
105
106ATF_TC_BODY(socketpair_basic, tc)
107{
108 run(0);
109}
110
111ATF_TC(socketpair_nonblock);
112ATF_TC_HEAD(socketpair_nonblock, tc)
113{
114 atf_tc_set_md_var(tc, "descr", "A non-blocking test of socketpair(2)");
115}
116
117ATF_TC_BODY(socketpair_nonblock, tc)
118{
119 run(SOCK_NONBLOCK);
120}
121
122ATF_TC(socketpair_cloexec);
123ATF_TC_HEAD(socketpair_cloexec, tc)
124{
125 atf_tc_set_md_var(tc, "descr", "A close-on-exec of socketpair(2)");
126}
127
128ATF_TC_BODY(socketpair_cloexec, tc)
129{
130 run(SOCK_CLOEXEC);
131}
132
133ATF_TP_ADD_TCS(tp)
134{
135
136 ATF_TP_ADD_TC(tp, socketpair_basic);
137 ATF_TP_ADD_TC(tp, socketpair_nonblock);
138 ATF_TP_ADD_TC(tp, socketpair_cloexec);
139
140 return atf_no_error();
141}