Esempio n. 1
0
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);
}
Esempio n. 2
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;
		}
	}
}