ATF_TC_BODY(range_blk, tc) { char buf[32000]; char cmpbuf[32000]; ssize_t n; int rv, tfd; /* create a 64000 byte file with 16 1's at offset = 32000 */ rv = system("dd if=/dev/zero of=disk.img bs=1000 count=64"); ATF_REQUIRE_EQ(rv, 0); rv = system("yes | tr '\\ny' '\\1' " "| dd of=disk.img conv=notrunc bs=1 count=16 seek=32000"); ATF_REQUIRE_EQ(rv, 0); /* map the file at [16000,48000]. this puts our 1's at offset 16000 */ rump_init(); ATF_REQUIRE_EQ(rump_pub_etfs_register_withsize(TESTPATH1, "disk.img", RUMP_ETFS_BLK, 16000, 32000), 0); tfd = rump_sys_open(TESTPATH1, O_RDWR); ATF_REQUIRE(tfd != -1); n = rump_sys_read(tfd, buf, sizeof(buf)); ATF_REQUIRE_EQ(n, sizeof(buf)); ATF_REQUIRE_EQ(rump_sys_close(tfd), 0); ATF_REQUIRE_EQ(rump_pub_etfs_remove(TESTPATH1), 0); /* check that we got what is expected */ memset(cmpbuf, 0, sizeof(cmpbuf)); memset(cmpbuf+16000, 1, 16); ATF_REQUIRE_EQ(memcmp(buf, cmpbuf, sizeof(buf)), 0); }
void __franken_fdinit_create() { int fd, ret, flags; int root = 0; char key[16], rkey[16], num[16]; int n_reg = 0, n_block = 0; struct ufs_args ufs; if (__franken_fd[0].valid) { mkkey(key, num, "/dev/vfile", n_reg++, 0); rump_pub_etfs_register(key, num, RUMP_ETFS_REG); fd = rump___sysimpl_open(key, O_RDONLY); if (fd != -1) { rump___sysimpl_dup2(fd, 0); rump___sysimpl_close(fd); } } if (__franken_fd[1].valid) { mkkey(key, num, "/dev/vfile", n_reg++, 1); rump_pub_etfs_register(key, num, RUMP_ETFS_REG); fd = rump___sysimpl_open(key, O_WRONLY); if (fd != -1) { rump___sysimpl_dup2(fd, 1); rump___sysimpl_close(fd); } } if (__franken_fd[2].valid) { mkkey(key, num, "/dev/vfile", n_reg++, 2); rump_pub_etfs_register(key, num, RUMP_ETFS_REG); fd = rump___sysimpl_open(key, O_WRONLY); if (fd != -1) { rump___sysimpl_dup2(fd, 2); rump___sysimpl_close(fd); } } for (fd = 3; fd < MAXFD; fd++) { if (__franken_fd[fd].valid == 0) break; switch (__franken_fd[fd].st.st_mode & S_IFMT) { case S_IFREG: mkkey(key, num, "/dev/vfile", n_reg++, fd); rump_pub_etfs_register(key, num, RUMP_ETFS_REG); flags = __franken_fd[fd].flags & O_ACCMODE; rump___sysimpl_open(key, flags); break; case S_IFBLK: mkkey(key, num, "/dev/block", n_block, fd); mkkey(rkey, num, "/dev/rblock", n_block, fd); n_block++; rump_pub_etfs_register_withsize(key, num, RUMP_ETFS_BLK, 0, __franken_fd[fd].st.st_size); rump_pub_etfs_register_withsize(rkey, num, RUMP_ETFS_CHR, 0, __franken_fd[fd].st.st_size); if (root == 0) { ufs.fspec = key; flags = __franken_fd[fd].flags & O_ACCMODE; if (flags == O_RDWR) flags = MNT_LOG; else flags = MNT_RDONLY; ret = rump___sysimpl_mount50("ffs", "/", flags, &ufs, sizeof(struct ufs_args)); if (ret == 0) { root = 1; } else { if (flags == MNT_LOG) flags = 0; ret = rump___sysimpl_mount50("ext2fs", "/", flags, &ufs, sizeof(struct ufs_args)); if (ret == 0) { root = 1; } } if (root == 1) atexit(unmount_atexit); } break; case S_IFSOCK: mkkey(key, num, "virt", fd, fd); ret = rump_pub_netconfig_ifcreate(key); if (ret == 0) { ret = rump___sysimpl_socket30(AF_INET6, SOCK_STREAM, 0); if (ret != -1) { rump_pub_netconfig_auto_ipv6(key); rump___sysimpl_close(ret); } ret = rump___sysimpl_socket30(AF_INET, SOCK_STREAM, 0); if (ret != -1) { rump_pub_netconfig_dhcp_ipv4_oneshot(key); rump___sysimpl_close(ret); } } break; } } }