198937Sdes/* $NetBSD: t_fd.c,v 1.9 2023/11/24 17:31:03 riastradh Exp $ */ 298937Sdes 398937Sdes/* 498937Sdes * Copyright (c) 2011 The NetBSD Foundation, Inc. 598937Sdes * All rights reserved. 698937Sdes * 798937Sdes * Redistribution and use in source and binary forms, with or without 898937Sdes * modification, are permitted provided that the following conditions 998937Sdes * are met: 1098937Sdes * 1. Redistributions of source code must retain the above copyright 1198937Sdes * notice, this list of conditions and the following disclaimer. 1298937Sdes * 2. Redistributions in binary form must reproduce the above copyright 1398937Sdes * notice, this list of conditions and the following disclaimer in the 1498937Sdes * documentation and/or other materials provided with the distribution. 1598937Sdes * 1698937Sdes * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 1798937Sdes * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 1898937Sdes * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1998937Sdes * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2098937Sdes * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 2198937Sdes * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2298937Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 2398937Sdes * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2498937Sdes * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25113908Sdes * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2698937Sdes * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2798937Sdes * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2898937Sdes */ 2998937Sdes 3098937Sdes#include <sys/types.h> 3198937Sdes#include <sys/stat.h> 3298937Sdes#include <sys/socket.h> 3398937Sdes 3498937Sdes#include <netinet/in.h> 3598937Sdes#include <arpa/inet.h> 3698937Sdes 3798937Sdes#include <atf-c.h> 3898937Sdes#include <errno.h> 3998937Sdes#include <fcntl.h> 4098937Sdes#include <unistd.h> 4198937Sdes 4298937Sdes#include <rump/rumpclient.h> 4398937Sdes#include <rump/rump_syscalls.h> 4498937Sdes 4598937Sdes#include "h_macros.h" 4698937Sdes 4798937SdesATF_TC_WITH_CLEANUP(bigenough); 4898937SdesATF_TC_HEAD(bigenough, tc) 4998937Sdes{ 5098937Sdes atf_tc_set_md_var(tc, "descr", "Check that rumpclient uses " 5198937Sdes "fd > 2"); 5298937Sdes} 5398937SdesATF_TC_WITH_CLEANUP(sigio); 5498937SdesATF_TC_HEAD(sigio, tc) 5598937Sdes{ 5698937Sdes atf_tc_set_md_var(tc, "descr", "Check that rump client receives " 5798937Sdes "SIGIO"); 5898937Sdes} 5998937Sdes 6098937Sdes#define RUMPSERV "unix://socket" 6198937Sdes 6298937SdesATF_TC_CLEANUP(bigenough, tc){system("env RUMP_SERVER=" RUMPSERV " rump.halt");} 6398937SdesATF_TC_CLEANUP(sigio, tc) { system("env RUMP_SERVER=" RUMPSERV " rump.halt"); } 6498937Sdes 6598937SdesATF_TC_BODY(bigenough, tc) 6698937Sdes{ 6798937Sdes struct stat sb; 6898937Sdes 6998937Sdes RL(system("rump_server " RUMPSERV)); 7098937Sdes RL(setenv("RUMP_SERVER", RUMPSERV, 1)); 7198937Sdes 7298937Sdes RL(dup2(0, 10)); 7398937Sdes RL(dup2(1, 11)); 7498937Sdes RL(dup2(2, 12)); 7598937Sdes 7698937Sdes RL(close(0)); 7798937Sdes RL(close(1)); 7898937Sdes RL(close(2)); 7998937Sdes 8098937Sdes RL(rumpclient_init()); 8198937Sdes RL(rump_sys_getpid()); 8298937Sdes 83113908Sdes ATF_REQUIRE_ERRNO(EBADF, fstat(0, &sb) == -1); 84113908Sdes ATF_REQUIRE_ERRNO(EBADF, fstat(1, &sb) == -1); 85113908Sdes ATF_REQUIRE_ERRNO(EBADF, fstat(2, &sb) == -1); 86113908Sdes 87113908Sdes RL(rump_sys_getpid()); 88113908Sdes 89113908Sdes /* restore these. does it help? */ 90113908Sdes dup2(10, 0); 91113908Sdes dup2(11, 1); 9298937Sdes dup2(12, 2); 9398937Sdes} 94 95static volatile sig_atomic_t sigcnt; 96static void 97gotsig(int sig) 98{ 99 100 sigcnt++; 101} 102 103ATF_TC_BODY(sigio, tc) 104{ 105 struct sockaddr_in sin; 106 int ls; 107 int cs; 108 int fl; 109 int sc; 110 111 signal(SIGIO, gotsig); 112 RL(system("rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet " 113 RUMPSERV)); 114 RL(setenv("RUMP_SERVER", RUMPSERV, 1)); 115 116 RL(rumpclient_init()); 117 RL(ls = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); 118 119 RL(rump_sys_fcntl(ls, F_SETOWN, rump_sys_getpid())); 120 RL(fl = rump_sys_fcntl(ls, F_GETFL)); 121 RL(rump_sys_fcntl(ls, F_SETFL, fl | O_ASYNC)); 122 123 memset(&sin, 0, sizeof(sin)); 124 sin.sin_len = sizeof(sin); 125 sin.sin_family = AF_INET; 126 sin.sin_port = htons(12345); 127 RL(rump_sys_bind(ls, (struct sockaddr *)&sin, sizeof(sin))); 128 RL(rump_sys_listen(ls, 5)); 129 130 RL(cs = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); 131 sin.sin_addr.s_addr = inet_addr("127.0.0.1"); 132 133 ATF_REQUIRE_EQ(sigcnt, 0); 134 RL(rump_sys_connect(cs, (struct sockaddr *)&sin, sizeof(sin))); 135 sc = sigcnt; 136 printf("sigcnt after connect: %d\n", sc); 137 ATF_REQUIRE(sc >= 1); 138} 139 140ATF_TP_ADD_TCS(tp) 141{ 142 ATF_TP_ADD_TC(tp, bigenough); 143 ATF_TP_ADD_TC(tp, sigio); 144 145 return atf_no_error(); 146} 147