t_socketpair.c revision 276478
12116Sjkh/* $NetBSD: t_socketpair.c,v 1.1 2011/11/05 18:19:02 jruoho Exp $ */
22116Sjkh
32116Sjkh/*-
42116Sjkh * Copyright (c) 2011 The NetBSD Foundation, Inc.
52116Sjkh * All rights reserved.
62116Sjkh *
72116Sjkh * This code is derived from software contributed to The NetBSD Foundation
82116Sjkh * by Christos Zoulas.
92116Sjkh *
102116Sjkh * Redistribution and use in source and binary forms, with or without
118870Srgrimes * modification, are permitted provided that the following conditions
122116Sjkh * are met:
132116Sjkh * 1. Redistributions of source code must retain the above copyright
142116Sjkh *    notice, this list of conditions and the following disclaimer.
152116Sjkh * 2. Redistributions in binary form must reproduce the above copyright
16176451Sdas *    notice, this list of conditions and the following disclaimer in the
17176451Sdas *    documentation and/or other materials provided with the distribution.
182116Sjkh * 3. All advertising materials mentioning features or use of this software
192116Sjkh *    must display the following acknowledgement:
202116Sjkh *        This product includes software developed by the NetBSD
212116Sjkh *        Foundation, Inc. and its contributors.
222116Sjkh * 4. Neither the name of The NetBSD Foundation nor the names of its
232116Sjkh *    contributors may be used to endorse or promote products derived
248870Srgrimes *    from this software without specific prior written permission.
252116Sjkh *
262116Sjkh * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
272116Sjkh * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
282116Sjkh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
292116Sjkh * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
302116Sjkh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
312116Sjkh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
322116Sjkh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
332116Sjkh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
342116Sjkh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
352116Sjkh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
362116Sjkh * POSSIBILITY OF SUCH DAMAGE.
372116Sjkh */
382116Sjkh#include <sys/cdefs.h>
392116Sjkh__RCSID("$NetBSD: t_socketpair.c,v 1.1 2011/11/05 18:19:02 jruoho Exp $");
402116Sjkh
4197413Salfred#include <atf-c.h>
4297413Salfred#include <fcntl.h>
432116Sjkh#include <unistd.h>
442116Sjkh#include <stdlib.h>
452116Sjkh#include <sys/socket.h>
462116Sjkh#include <sys/un.h>
472116Sjkh#include <errno.h>
482116Sjkh
492116Sjkhstatic void
502116Sjkhconnected(int fd)
512116Sjkh{
522116Sjkh	struct sockaddr_un addr;
532116Sjkh	socklen_t len = (socklen_t)sizeof(addr);
542116Sjkh	ATF_REQUIRE(getpeername(fd, (struct sockaddr*)(void *)&addr,
552116Sjkh	    &len) == 0);
562116Sjkh}
572116Sjkh
582116Sjkhstatic void
592116Sjkhrun(int flags)
602116Sjkh{
612116Sjkh	int fd[2], i;
622116Sjkh
632116Sjkh	while ((i = open("/", O_RDONLY)) < 3)
642116Sjkh		ATF_REQUIRE(i != -1);
652116Sjkh
662116Sjkh#ifdef __FreeBSD__
672116Sjkh	closefrom(3);
682116Sjkh#else
692116Sjkh	ATF_REQUIRE(fcntl(3, F_CLOSEM) != -1);
702116Sjkh#endif
712116Sjkh
722116Sjkh	ATF_REQUIRE(socketpair(AF_UNIX, SOCK_DGRAM | flags, 0, fd) == 0);
732116Sjkh
742116Sjkh	ATF_REQUIRE(fd[0] == 3);
752116Sjkh	ATF_REQUIRE(fd[1] == 4);
762116Sjkh
772116Sjkh	connected(fd[0]);
782116Sjkh	connected(fd[1]);
792116Sjkh
802116Sjkh	if (flags & SOCK_CLOEXEC) {
812116Sjkh		ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) != 0);
822116Sjkh		ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) != 0);
832116Sjkh	} else {
842116Sjkh		ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOEXEC) == 0);
852116Sjkh		ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) == 0);
862116Sjkh	}
872116Sjkh
882116Sjkh	if (flags & SOCK_NONBLOCK) {
892116Sjkh		ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) != 0);
902116Sjkh		ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) != 0);
912116Sjkh	} else {
922116Sjkh		ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) == 0);
932116Sjkh		ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) == 0);
942116Sjkh	}
952116Sjkh
962116Sjkh	ATF_REQUIRE(close(fd[0]) != -1);
972116Sjkh	ATF_REQUIRE(close(fd[1]) != -1);
982116Sjkh}
992116Sjkh
1002116SjkhATF_TC(socketpair_basic);
1012116SjkhATF_TC_HEAD(socketpair_basic, tc)
10297413Salfred{
10397413Salfred	atf_tc_set_md_var(tc, "descr", "A basic test of socketpair(2)");
1042116Sjkh}
1052116Sjkh
1062116SjkhATF_TC_BODY(socketpair_basic, tc)
1072116Sjkh{
1082116Sjkh	run(0);
1092116Sjkh}
1102116Sjkh
1118870SrgrimesATF_TC(socketpair_nonblock);
1122116SjkhATF_TC_HEAD(socketpair_nonblock, tc)
1132116Sjkh{
1142116Sjkh	atf_tc_set_md_var(tc, "descr", "A non-blocking test of socketpair(2)");
1152116Sjkh}
1162116Sjkh
1172116SjkhATF_TC_BODY(socketpair_nonblock, tc)
1182116Sjkh{
1192116Sjkh	run(SOCK_NONBLOCK);
1202116Sjkh}
1212116Sjkh
1222116SjkhATF_TC(socketpair_cloexec);
1232116SjkhATF_TC_HEAD(socketpair_cloexec, tc)
1242116Sjkh{
1252116Sjkh	atf_tc_set_md_var(tc, "descr", "A close-on-exec of socketpair(2)");
1262116Sjkh}
1272116Sjkh
1282116SjkhATF_TC_BODY(socketpair_cloexec, tc)
1292116Sjkh{
1302116Sjkh	run(SOCK_CLOEXEC);
1312116Sjkh}
1322116Sjkh
1332116SjkhATF_TP_ADD_TCS(tp)
1342116Sjkh{
1352116Sjkh
1362116Sjkh	ATF_TP_ADD_TC(tp, socketpair_basic);
1372116Sjkh	ATF_TP_ADD_TC(tp, socketpair_nonblock);
1382116Sjkh	ATF_TP_ADD_TC(tp, socketpair_cloexec);
1392116Sjkh
1402116Sjkh	return atf_no_error();
1412116Sjkh}
1422116Sjkh