1*57718be8SEnji Cooper /* $NetBSD: t_fd.c,v 1.4 2011/08/25 18:46:01 hannken Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /* 4*57718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc. 5*57718be8SEnji Cooper * All rights reserved. 6*57718be8SEnji Cooper * 7*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 8*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 9*57718be8SEnji Cooper * are met: 10*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 11*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 12*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 13*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 14*57718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 15*57718be8SEnji Cooper * 16*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17*57718be8SEnji Cooper * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18*57718be8SEnji Cooper * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*57718be8SEnji Cooper * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*57718be8SEnji Cooper * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21*57718be8SEnji Cooper * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*57718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23*57718be8SEnji Cooper * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*57718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25*57718be8SEnji Cooper * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26*57718be8SEnji Cooper * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*57718be8SEnji Cooper * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*57718be8SEnji Cooper */ 29*57718be8SEnji Cooper 30*57718be8SEnji Cooper #include <sys/types.h> 31*57718be8SEnji Cooper #include <sys/stat.h> 32*57718be8SEnji Cooper #include <sys/socket.h> 33*57718be8SEnji Cooper 34*57718be8SEnji Cooper #include <netinet/in.h> 35*57718be8SEnji Cooper #include <arpa/inet.h> 36*57718be8SEnji Cooper 37*57718be8SEnji Cooper #include <atf-c.h> 38*57718be8SEnji Cooper #include <errno.h> 39*57718be8SEnji Cooper #include <fcntl.h> 40*57718be8SEnji Cooper #include <unistd.h> 41*57718be8SEnji Cooper 42*57718be8SEnji Cooper #include <rump/rumpclient.h> 43*57718be8SEnji Cooper #include <rump/rump_syscalls.h> 44*57718be8SEnji Cooper 45*57718be8SEnji Cooper #include "../../h_macros.h" 46*57718be8SEnji Cooper 47*57718be8SEnji Cooper ATF_TC_WITH_CLEANUP(bigenough); 48*57718be8SEnji Cooper ATF_TC_HEAD(bigenough, tc) 49*57718be8SEnji Cooper { 50*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check that rumpclient uses " 51*57718be8SEnji Cooper "fd > 2"); 52*57718be8SEnji Cooper } 53*57718be8SEnji Cooper ATF_TC_WITH_CLEANUP(sigio); 54*57718be8SEnji Cooper ATF_TC_HEAD(sigio, tc) 55*57718be8SEnji Cooper { 56*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check that rump client receives " 57*57718be8SEnji Cooper "SIGIO"); 58*57718be8SEnji Cooper } 59*57718be8SEnji Cooper 60*57718be8SEnji Cooper #define RUMPSERV "unix://sucket" 61*57718be8SEnji Cooper 62*57718be8SEnji Cooper ATF_TC_CLEANUP(bigenough, tc){system("env RUMP_SERVER=" RUMPSERV " rump.halt");} 63*57718be8SEnji Cooper ATF_TC_CLEANUP(sigio, tc) { system("env RUMP_SERVER=" RUMPSERV " rump.halt"); } 64*57718be8SEnji Cooper 65*57718be8SEnji Cooper ATF_TC_BODY(bigenough, tc) 66*57718be8SEnji Cooper { 67*57718be8SEnji Cooper struct stat sb; 68*57718be8SEnji Cooper 69*57718be8SEnji Cooper RZ(system("rump_server " RUMPSERV)); 70*57718be8SEnji Cooper RL(setenv("RUMP_SERVER", RUMPSERV, 1)); 71*57718be8SEnji Cooper 72*57718be8SEnji Cooper RL(dup2(0, 10)); 73*57718be8SEnji Cooper RL(dup2(1, 11)); 74*57718be8SEnji Cooper RL(dup2(2, 12)); 75*57718be8SEnji Cooper 76*57718be8SEnji Cooper RL(close(0)); 77*57718be8SEnji Cooper RL(close(1)); 78*57718be8SEnji Cooper RL(close(2)); 79*57718be8SEnji Cooper 80*57718be8SEnji Cooper RL(rumpclient_init()); 81*57718be8SEnji Cooper RL(rump_sys_getpid()); 82*57718be8SEnji Cooper 83*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, fstat(0, &sb) == -1); 84*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, fstat(1, &sb) == -1); 85*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, fstat(2, &sb) == -1); 86*57718be8SEnji Cooper 87*57718be8SEnji Cooper RL(rump_sys_getpid()); 88*57718be8SEnji Cooper 89*57718be8SEnji Cooper /* restore these. does it help? */ 90*57718be8SEnji Cooper dup2(10, 0); 91*57718be8SEnji Cooper dup2(11, 1); 92*57718be8SEnji Cooper dup2(12, 2); 93*57718be8SEnji Cooper } 94*57718be8SEnji Cooper 95*57718be8SEnji Cooper static volatile sig_atomic_t sigcnt; 96*57718be8SEnji Cooper static void 97*57718be8SEnji Cooper gotsig(int sig) 98*57718be8SEnji Cooper { 99*57718be8SEnji Cooper 100*57718be8SEnji Cooper sigcnt++; 101*57718be8SEnji Cooper } 102*57718be8SEnji Cooper 103*57718be8SEnji Cooper ATF_TC_BODY(sigio, tc) 104*57718be8SEnji Cooper { 105*57718be8SEnji Cooper struct sockaddr_in sin; 106*57718be8SEnji Cooper int ls; 107*57718be8SEnji Cooper int cs; 108*57718be8SEnji Cooper int fl; 109*57718be8SEnji Cooper int sc; 110*57718be8SEnji Cooper 111*57718be8SEnji Cooper signal(SIGIO, gotsig); 112*57718be8SEnji Cooper RZ(system("rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet " 113*57718be8SEnji Cooper RUMPSERV)); 114*57718be8SEnji Cooper RL(setenv("RUMP_SERVER", RUMPSERV, 1)); 115*57718be8SEnji Cooper 116*57718be8SEnji Cooper RL(rumpclient_init()); 117*57718be8SEnji Cooper RL(ls = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); 118*57718be8SEnji Cooper 119*57718be8SEnji Cooper RL(rump_sys_fcntl(ls, F_SETOWN, rump_sys_getpid())); 120*57718be8SEnji Cooper RL(fl = rump_sys_fcntl(ls, F_GETFL)); 121*57718be8SEnji Cooper RL(rump_sys_fcntl(ls, F_SETFL, fl | O_ASYNC)); 122*57718be8SEnji Cooper 123*57718be8SEnji Cooper memset(&sin, 0, sizeof(sin)); 124*57718be8SEnji Cooper sin.sin_len = sizeof(sin); 125*57718be8SEnji Cooper sin.sin_family = AF_INET; 126*57718be8SEnji Cooper sin.sin_port = htons(12345); 127*57718be8SEnji Cooper RL(rump_sys_bind(ls, (struct sockaddr *)&sin, sizeof(sin))); 128*57718be8SEnji Cooper RL(rump_sys_listen(ls, 5)); 129*57718be8SEnji Cooper 130*57718be8SEnji Cooper RL(cs = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); 131*57718be8SEnji Cooper sin.sin_addr.s_addr = inet_addr("127.0.0.1"); 132*57718be8SEnji Cooper 133*57718be8SEnji Cooper ATF_REQUIRE_EQ(sigcnt, 0); 134*57718be8SEnji Cooper RL(rump_sys_connect(cs, (struct sockaddr *)&sin, sizeof(sin))); 135*57718be8SEnji Cooper sc = sigcnt; 136*57718be8SEnji Cooper printf("sigcnt after connect: %d\n", sc); 137*57718be8SEnji Cooper ATF_REQUIRE(sc >= 1); 138*57718be8SEnji Cooper } 139*57718be8SEnji Cooper 140*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 141*57718be8SEnji Cooper { 142*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bigenough); 143*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, sigio); 144*57718be8SEnji Cooper 145*57718be8SEnji Cooper return atf_no_error(); 146*57718be8SEnji Cooper } 147