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