int main() { struct sockaddr_in sin; char buf[65535]; struct hostent *hp; ssize_t nn; ssize_t off; int s, e; hp = gethostbyname(DESTHOST); if (!hp || hp->h_addrtype != AF_INET) errx(1, "failed to resolve \"%s\"", DESTHOST); rump_init(); #ifndef USE_SOCKIN if ((e = rump_pub_netconfig_ifcreate("virt0")) != 0) die(e, "create virt0"); if ((e = rump_pub_netconfig_dhcp_ipv4_oneshot("virt0")) != 0) die(e, "dhcp address"); #endif s = rump_sys_socket(PF_INET, SOCK_STREAM, 0); if (s == -1) die(errno, "socket"); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; #if 0 sin.sin_len = sizeof(sin); #endif sin.sin_port = htons(80); memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr)); if (rump_sys_connect(s, (struct sockaddr *)&sin, sizeof(sin)) == -1) die(errno, "connect"); printf("connected\n"); #define WANTHTML "GET / HTTP/1.1\nHost: www.netbsd.org\n\n" nn = rump_sys_write(s, WANTHTML, sizeof(WANTHTML)-1); printf("write rv %zd\n", nn); for (;;) { nn = rump_sys_read(s, buf, sizeof(buf)-1); if (nn == -1) die(errno, "read failed"); if (nn == 0) break; buf[nn] = '\0'; printf("%s", buf); } rump_sys_close(s); die(0, NULL); }
int netconnect() { struct sockaddr_in sin; char *buf; ssize_t nn, off; int error; int s; s = rump_sys_socket(PF_INET, SOCK_STREAM, 0); if (s == -1) { printf("you're mean! no sucket for you!\n"); return -1; } printf("!!!\nTHE FD value: %d\n!!!\n", s); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(80); sin.sin_addr.s_addr = DESTADDR; if (rump_sys_connect(s, (struct sockaddr *)&sin, sizeof(sin)) == -1) { printf("could not connect\n"); return -1; } nn = rump_sys_write(s, WANTHTML, sizeof(WANTHTML)-1); printf("wrote http request, rv %zd\n", nn); buf = calloc(1, BUFSIZE); off = 0; do { nn = rump_sys_read(s, buf+off, (BUFSIZE-off)-1); off += nn; if (off >= BUFSIZE) exit(-1); } while (nn > 0); if (nn == -1) { printf("read failed: %zd\n", nn); return -1; } printf("read %zd bytes\n", off); /* display last 500 bytes of delicious info */ buf[off] = '\0'; off -= 500; if (off < 0) off = 0; printf("that was an educational experience. " "we learned:\n"); printf("%s", &buf[off]); }
ATF_TC_BODY(sigio, tc) { struct sockaddr_in sin; int ls; int cs; int fl; int sc; signal(SIGIO, gotsig); RZ(system("rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet " RUMPSERV)); RL(setenv("RUMP_SERVER", RUMPSERV, 1)); RL(rumpclient_init()); RL(ls = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); RL(rump_sys_fcntl(ls, F_SETOWN, rump_sys_getpid())); RL(fl = rump_sys_fcntl(ls, F_GETFL)); RL(rump_sys_fcntl(ls, F_SETFL, fl | O_ASYNC)); memset(&sin, 0, sizeof(sin)); sin.sin_len = sizeof(sin); sin.sin_family = AF_INET; sin.sin_port = htons(12345); RL(rump_sys_bind(ls, (struct sockaddr *)&sin, sizeof(sin))); RL(rump_sys_listen(ls, 5)); RL(cs = rump_sys_socket(PF_INET, SOCK_STREAM, 0)); sin.sin_addr.s_addr = inet_addr("127.0.0.1"); ATF_REQUIRE_EQ(sigcnt, 0); RL(rump_sys_connect(cs, (struct sockaddr *)&sin, sizeof(sin))); sc = sigcnt; printf("sigcnt after connect: %d\n", sc); ATF_REQUIRE(sc >= 1); }