ATF_TC_BODY(OOSIOCGIFBRDADDR, tc) { int fd, ifnum; struct oifreq ifreq; struct sockaddr_in *sin; int rv; memset(&ifreq,'\0',sizeof ifreq); rump_init(); /* create an interface and give it netmask 0xffff0000 */ rv = rump_pub_shmif_create("bus", &ifnum); if (rv) atf_tc_fail("failed to create shmif: %s", strerror(rv)); sprintf(ifreq.ifr_name, "shmif%d", ifnum); netcfg_rump_if(ifreq.ifr_name, "1.7.64.10", "255.255.0.0"); /* query kernel for iface bcast */ RL(fd = rump_sys_socket(AF_INET, SOCK_DGRAM, 0)); RL(rump_sys_ioctl(fd, OOSIOCGIFBRDADDR, &ifreq)); /* make sure we got what we deserve */ sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; ATF_REQUIRE_EQ(sin->sin_addr.s_addr, htonl(0x0107ffff)); rump_sys_close(fd); }
ATF_TC_BODY(bpfwriteleak, tc) { char buf[28]; /* sizeof(garbage) > etherhdrlen */ struct ifreq ifr; int ifnum, bpfd; RZ(rump_init()); RZ(rump_pub_shmif_create(NULL, &ifnum)); sprintf(ifr.ifr_name, "shmif%d", ifnum); RL(bpfd = rump_sys_open("/dev/bpf", O_RDWR)); RL(rump_sys_ioctl(bpfd, BIOCSETIF, &ifr)); RL(rump_sys_ioctl(bpfd, BIOCSFEEDBACK, &ifr)); if (getmtdata() != 0) atf_tc_fail("test precondition failed: MT_DATA mbufs != 0"); ATF_REQUIRE_ERRNO(ENETDOWN, rump_sys_write(bpfd, buf, sizeof(buf))==-1); ATF_REQUIRE_EQ(getmtdata(), 0); }
int main(int argc, char *argv[]) { rump_init(); struct sigaction sigact = { .sa_handler = cleanup }; sigaction(SIGINT, &sigact, NULL); sigaction(SIGTERM, &sigact, NULL); ERR("Fetching bus name\n"); unix_socket = socket(AF_UNIX, SOCK_STREAM, 0); if (!unix_socket) { ERR("socket() failed"); die(errno, "socket"); } struct sockaddr_un sockaddr = { .sun_family = AF_UNIX, .sun_path = SOCK_FN, }; if (connect(unix_socket, (struct sockaddr *)&sockaddr, sizeof(sockaddr))) { die(errno, "connect"); } // initialise swarm_ipc sipc_client_set_socket(unix_socket); ERR("request SHM\n"); if (request_swarm_getshm()) { ERR("Could request SHM\n"); die(errno, "payload"); } ERR("Fetching answer\n"); if (rcv_message_type_sock() != SWARM_GETSHM_REPLY) { ERR("Incompatible server\n"); die(errno, "reply"); } char *filename; in_addr_t ip_address; if (rcv_reply_swarm_getshm(&ip_address, &filename) < 0) { ERR("Could not read reply\n"); die(errno, "read"); } // bus file must be local and stat()-able struct stat statstruct = {}; if (stat(filename, &statstruct) != 0) { free(filename); die(errno, "stat"); } ERR("Creating Bus\n"); rump_pub_shmif_create(filename, 0); free(filename); char const *ip_address_str = inet_ntoa( (struct in_addr) { .s_addr = ip_address } );