t_socketpair.c revision 272343
1251875Speter/* $NetBSD: t_socketpair.c,v 1.1 2011/11/05 18:19:02 jruoho Exp $ */
2251875Speter
3251875Speter/*-
4251875Speter * Copyright (c) 2011 The NetBSD Foundation, Inc.
5251875Speter * All rights reserved.
6251875Speter *
7251875Speter * This code is derived from software contributed to The NetBSD Foundation
8251875Speter * by Christos Zoulas.
9251875Speter *
10251875Speter * Redistribution and use in source and binary forms, with or without
11251875Speter * modification, are permitted provided that the following conditions
12251875Speter * are met:
13251875Speter * 1. Redistributions of source code must retain the above copyright
14251875Speter *    notice, this list of conditions and the following disclaimer.
15251875Speter * 2. Redistributions in binary form must reproduce the above copyright
16251875Speter *    notice, this list of conditions and the following disclaimer in the
17251875Speter *    documentation and/or other materials provided with the distribution.
18251875Speter * 3. All advertising materials mentioning features or use of this software
19251875Speter *    must display the following acknowledgement:
20251875Speter *        This product includes software developed by the NetBSD
21251875Speter *        Foundation, Inc. and its contributors.
22251875Speter * 4. Neither the name of The NetBSD Foundation nor the names of its
23251875Speter *    contributors may be used to endorse or promote products derived
24251875Speter *    from this software without specific prior written permission.
25251875Speter *
26251875Speter * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27251875Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28251875Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29251875Speter * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30251875Speter * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31251875Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32251875Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33251875Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34251875Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35251875Speter * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36251875Speter * POSSIBILITY OF SUCH DAMAGE.
37251875Speter */
38251875Speter#include <sys/cdefs.h>
39251875Speter__RCSID("$NetBSD: t_socketpair.c,v 1.1 2011/11/05 18:19:02 jruoho Exp $");
40251875Speter
41251875Speter#include <atf-c.h>
42251875Speter#include <fcntl.h>
43251875Speter#include <unistd.h>
44251875Speter#include <stdlib.h>
45251875Speter#include <sys/socket.h>
46251875Speter#include <sys/un.h>
47251875Speter#include <errno.h>
48251875Speter
49251875Speterstatic void
50251875Speterconnected(int fd)
51251875Speter{
52251875Speter	struct sockaddr_un addr;
53251875Speter	socklen_t len = (socklen_t)sizeof(addr);
54251875Speter	ATF_REQUIRE(getpeername(fd, (struct sockaddr*)(void *)&addr,
55251875Speter	    &len) == 0);
56251875Speter}
57251875Speter
58251875Speterstatic void
59251875Speterrun(int flags)
60251875Speter{
61251875Speter	int fd[2], i;
62251875Speter
63251875Speter	while ((i = open("/", O_RDONLY)) < 3)
64251875Speter		ATF_REQUIRE(i != -1);
65251875Speter
66251875Speter	ATF_REQUIRE(fcntl(3, F_CLOSEM) != -1);
67251875Speter
68251875Speter	ATF_REQUIRE(socketpair(AF_UNIX, SOCK_DGRAM | flags, 0, fd) == 0);
69251875Speter
70251875Speter	ATF_REQUIRE(fd[0] == 3);
71251875Speter	ATF_REQUIRE(fd[1] == 4);
72251875Speter
73251875Speter	connected(fd[0]);
74251875Speter	connected(fd[1]);
75251875Speter
76251875Speter	if (flags & SOCK_CLOEXEC) {
77251875Speter		ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) != 0);
78251875Speter		ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) != 0);
79251875Speter	} else {
80251875Speter		ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) == 0);
81251875Speter		ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) == 0);
82251875Speter	}
83251875Speter
84251875Speter	if (flags & SOCK_NONBLOCK) {
85251875Speter		ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) != 0);
86251875Speter		ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) != 0);
87251875Speter	} else {
88251875Speter		ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) == 0);
89251875Speter		ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) == 0);
90251875Speter	}
91251875Speter
92251875Speter	ATF_REQUIRE(close(fd[0]) != -1);
93251875Speter	ATF_REQUIRE(close(fd[1]) != -1);
94251875Speter}
95251875Speter
96251875SpeterATF_TC(socketpair_basic);
97251875SpeterATF_TC_HEAD(socketpair_basic, tc)
98251875Speter{
99251875Speter	atf_tc_set_md_var(tc, "descr", "A basic test of socketpair(2)");
100251875Speter}
101251875Speter
102251875SpeterATF_TC_BODY(socketpair_basic, tc)
103251875Speter{
104251875Speter	run(0);
105251875Speter}
106251875Speter
107251875SpeterATF_TC(socketpair_nonblock);
108251875SpeterATF_TC_HEAD(socketpair_nonblock, tc)
109251875Speter{
110251875Speter	atf_tc_set_md_var(tc, "descr", "A non-blocking test of socketpair(2)");
111251875Speter}
112251875Speter
113251875SpeterATF_TC_BODY(socketpair_nonblock, tc)
114251875Speter{
115251875Speter	run(SOCK_NONBLOCK);
116251875Speter}
117251875Speter
118251875SpeterATF_TC(socketpair_cloexec);
119251875SpeterATF_TC_HEAD(socketpair_cloexec, tc)
120251875Speter{
121251875Speter	atf_tc_set_md_var(tc, "descr", "A close-on-exec of socketpair(2)");
122251875Speter}
123251875Speter
124251875SpeterATF_TC_BODY(socketpair_cloexec, tc)
125251875Speter{
126251875Speter	run(SOCK_CLOEXEC);
127251875Speter}
128251875Speter
129251875SpeterATF_TP_ADD_TCS(tp)
130251875Speter{
131251875Speter
132251875Speter	ATF_TP_ADD_TC(tp, socketpair_basic);
133251875Speter	ATF_TP_ADD_TC(tp, socketpair_nonblock);
134251875Speter	ATF_TP_ADD_TC(tp, socketpair_cloexec);
135251875Speter
136251875Speter	return atf_no_error();
137251875Speter}
138251875Speter