1*63d1fd59SEnji Cooper /* $NetBSD: t_fd.c,v 1.6 2017/01/13 21:30:41 christos Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /* 457718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc. 557718be8SEnji Cooper * All rights reserved. 657718be8SEnji Cooper * 757718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 857718be8SEnji Cooper * modification, are permitted provided that the following conditions 957718be8SEnji Cooper * are met: 1057718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 1157718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 1257718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1357718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 1457718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 1557718be8SEnji Cooper * 1657718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 1757718be8SEnji Cooper * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 1857718be8SEnji Cooper * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1957718be8SEnji Cooper * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2057718be8SEnji Cooper * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 2157718be8SEnji Cooper * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2257718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 2357718be8SEnji Cooper * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2457718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 2557718be8SEnji Cooper * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2657718be8SEnji Cooper * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2757718be8SEnji Cooper * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2857718be8SEnji Cooper */ 2957718be8SEnji Cooper 3057718be8SEnji Cooper #include <sys/types.h> 3157718be8SEnji Cooper #include <sys/stat.h> 3257718be8SEnji Cooper #include <sys/socket.h> 3357718be8SEnji Cooper 3457718be8SEnji Cooper #include <netinet/in.h> 3557718be8SEnji Cooper #include <arpa/inet.h> 3657718be8SEnji Cooper 3757718be8SEnji Cooper #include <atf-c.h> 3857718be8SEnji Cooper #include <errno.h> 3957718be8SEnji Cooper #include <fcntl.h> 4057718be8SEnji Cooper #include <unistd.h> 4157718be8SEnji Cooper 4257718be8SEnji Cooper #include <rump/rumpclient.h> 4357718be8SEnji Cooper #include <rump/rump_syscalls.h> 4457718be8SEnji Cooper 45*63d1fd59SEnji Cooper #include "h_macros.h" 4657718be8SEnji Cooper 4757718be8SEnji Cooper ATF_TC_WITH_CLEANUP(bigenough); 4857718be8SEnji Cooper ATF_TC_HEAD(bigenough, tc) 4957718be8SEnji Cooper { 5057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check that rumpclient uses " 5157718be8SEnji Cooper "fd > 2"); 5257718be8SEnji Cooper } 5357718be8SEnji Cooper ATF_TC_WITH_CLEANUP(sigio); 5457718be8SEnji Cooper ATF_TC_HEAD(sigio, tc) 5557718be8SEnji Cooper { 5657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check that rump client receives " 5757718be8SEnji Cooper "SIGIO"); 5857718be8SEnji Cooper } 5957718be8SEnji Cooper 6057718be8SEnji Cooper #define RUMPSERV "unix://sucket" 6157718be8SEnji Cooper 6257718be8SEnji Cooper ATF_TC_CLEANUP(bigenough, tc){system("env RUMP_SERVER=" RUMPSERV " rump.halt");} 6357718be8SEnji Cooper ATF_TC_CLEANUP(sigio, tc) { system("env RUMP_SERVER=" RUMPSERV " rump.halt"); } 6457718be8SEnji Cooper 6557718be8SEnji Cooper ATF_TC_BODY(bigenough, tc) 6657718be8SEnji Cooper { 6757718be8SEnji Cooper struct stat sb; 6857718be8SEnji Cooper 6957718be8SEnji Cooper RZ(system("rump_server " RUMPSERV)); 7057718be8SEnji Cooper RL(setenv("RUMP_SERVER", RUMPSERV, 1)); 7157718be8SEnji Cooper 7257718be8SEnji Cooper RL(dup2(0, 10)); 7357718be8SEnji Cooper RL(dup2(1, 11)); 7457718be8SEnji Cooper RL(dup2(2, 12)); 7557718be8SEnji Cooper 7657718be8SEnji Cooper RL(close(0)); 7757718be8SEnji Cooper RL(close(1)); 7857718be8SEnji Cooper RL(close(2)); 7957718be8SEnji Cooper 8057718be8SEnji Cooper RL(rumpclient_init()); 8157718be8SEnji Cooper RL(rump_sys_getpid()); 8257718be8SEnji Cooper 8357718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, fstat(0, &sb) == -1); 8457718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, fstat(1, &sb) == -1); 8557718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, fstat(2, &sb) == -1); 8657718be8SEnji Cooper 8757718be8SEnji Cooper RL(rump_sys_getpid()); 8857718be8SEnji Cooper 8957718be8SEnji Cooper /* restore these. does it help? */ 9057718be8SEnji Cooper dup2(10, 0); 9157718be8SEnji Cooper dup2(11, 1); 9257718be8SEnji Cooper dup2(12, 2); 9357718be8SEnji Cooper } 9457718be8SEnji Cooper 9557718be8SEnji Cooper static volatile sig_atomic_t sigcnt; 9657718be8SEnji Cooper static void 9757718be8SEnji Cooper gotsig(int sig) 9857718be8SEnji Cooper { 9957718be8SEnji Cooper 10057718be8SEnji Cooper sigcnt++; 10157718be8SEnji Cooper } 10257718be8SEnji Cooper 10357718be8SEnji Cooper ATF_TC_BODY(sigio, tc) 10457718be8SEnji Cooper { 10557718be8SEnji Cooper struct sockaddr_in sin; 10657718be8SEnji Cooper int ls; 10757718be8SEnji Cooper int cs; 10857718be8SEnji Cooper int fl; 10957718be8SEnji Cooper int sc; 11057718be8SEnji Cooper 11157718be8SEnji Cooper signal(SIGIO, gotsig); 11257718be8SEnji Cooper RZ(system("rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet " 113640235e2SEnji Cooper "-lrumpdev -lrumpvfs " RUMPSERV)); 11457718be8SEnji Cooper RL(setenv("RUMP_SERVER", RUMPSERV, 1)); 11557718be8SEnji Cooper 11657718be8SEnji Cooper RL(rumpclient_init()); 11757718be8SEnji Cooper RL(ls = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); 11857718be8SEnji Cooper 11957718be8SEnji Cooper RL(rump_sys_fcntl(ls, F_SETOWN, rump_sys_getpid())); 12057718be8SEnji Cooper RL(fl = rump_sys_fcntl(ls, F_GETFL)); 12157718be8SEnji Cooper RL(rump_sys_fcntl(ls, F_SETFL, fl | O_ASYNC)); 12257718be8SEnji Cooper 12357718be8SEnji Cooper memset(&sin, 0, sizeof(sin)); 12457718be8SEnji Cooper sin.sin_len = sizeof(sin); 12557718be8SEnji Cooper sin.sin_family = AF_INET; 12657718be8SEnji Cooper sin.sin_port = htons(12345); 12757718be8SEnji Cooper RL(rump_sys_bind(ls, (struct sockaddr *)&sin, sizeof(sin))); 12857718be8SEnji Cooper RL(rump_sys_listen(ls, 5)); 12957718be8SEnji Cooper 13057718be8SEnji Cooper RL(cs = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); 13157718be8SEnji Cooper sin.sin_addr.s_addr = inet_addr("127.0.0.1"); 13257718be8SEnji Cooper 13357718be8SEnji Cooper ATF_REQUIRE_EQ(sigcnt, 0); 13457718be8SEnji Cooper RL(rump_sys_connect(cs, (struct sockaddr *)&sin, sizeof(sin))); 13557718be8SEnji Cooper sc = sigcnt; 13657718be8SEnji Cooper printf("sigcnt after connect: %d\n", sc); 13757718be8SEnji Cooper ATF_REQUIRE(sc >= 1); 13857718be8SEnji Cooper } 13957718be8SEnji Cooper 14057718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 14157718be8SEnji Cooper { 14257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bigenough); 14357718be8SEnji Cooper ATF_TP_ADD_TC(tp, sigio); 14457718be8SEnji Cooper 14557718be8SEnji Cooper return atf_no_error(); 14657718be8SEnji Cooper } 147