Example #1
0
int
rumpuser_iovwrite(int fd, const struct rumpuser_iovec *ruiov, size_t iovlen,
	int64_t roff, size_t *retp)
{
	const struct iovec *iov = (const struct iovec *)ruiov;
	off_t off = (off_t)roff;
	ssize_t nn;
	int rv;

	if (off == RUMPUSER_IOV_NOSEEK) {
		KLOCK_WRAP(nn = writev(fd, iov, iovlen));
	} else {
		int nlocks;

		rumpkern_unsched(&nlocks, NULL);
		if (lseek(fd, off, SEEK_SET) == off) {
			nn = writev(fd, iov, iovlen);
		} else {
			nn = -1;
		}
		rumpkern_sched(nlocks, NULL);
	}

	if (nn == -1) {
		rv = errno;
	} else {
		*retp = (size_t)nn;
		rv = 0;
	}

	ET(rv);
}
/* hmm, is there an absolute sleep in the linux kernel? */
int
rumpuser_clock_sleep(int enum_rumpclock, int64_t sec, long nsec)
{
	enum rumpclock clk = enum_rumpclock;
	struct timespec rqt;
	struct timespec ctime, delta;
	unsigned long timo;

	rqt.tv_sec = sec;
	rqt.tv_nsec = nsec;

	switch (clk) {
	case RUMPUSER_CLOCK_RELWALL:
		timo = timespec_to_jiffies(&rqt);
		break;
	case RUMPUSER_CLOCK_ABSMONO:
		ctime = current_kernel_time();
		delta = timespec_sub(rqt, ctime);
		if (!timespec_valid(&delta))
			goto out;
		timo = timespec_to_jiffies(&delta);
		break;
	default:	
		panic("unreachable");
	}

	set_current_state(TASK_UNINTERRUPTIBLE);
	KLOCK_WRAP(schedule_timeout(timo));

 out:
	return 0;
}
void
rumpcomp_virtif_send(struct virtif_user *vu, struct iovec *iov, size_t niov)
{
	mm_segment_t oseg;
	loff_t off = 0;
	ssize_t nn;

	oseg = get_fs();
	set_fs(get_ds());
	/* something is written, rest (if any) is dropped */
	KLOCK_WRAP(nn = vfs_writev(vu->tapfile, iov, niov, &off));
	set_fs(oseg);
}
int
rumpcomp_virtif_recv(struct virtif_user *vu, void *buf, size_t buflen,
	size_t *recvd)
{
	mm_segment_t oseg;
	loff_t off = 0;
	ssize_t nn;

	oseg = get_fs();
	set_fs(get_ds());
	KLOCK_WRAP(nn = vfs_read(vu->tapfile, buf, buflen, &off));
	set_fs(oseg);

	if (nn < 0)
		return (int)(-nn);
	*recvd = (size_t)nn;

	return 0;
}
Example #5
0
int
rumpuser_open(const char *path, int ruflags, int *fdp)
{
	int fd, flags, rv;

	switch (ruflags & RUMPUSER_OPEN_ACCMODE) {
	case RUMPUSER_OPEN_RDONLY:
		flags = O_RDONLY;
		break;
	case RUMPUSER_OPEN_WRONLY:
		flags = O_WRONLY;
		break;
	case RUMPUSER_OPEN_RDWR:
		flags = O_RDWR;
		break;
	default:
		rv = EINVAL;
		goto out;
	}

#define TESTSET(_ru_, _h_) if (ruflags & _ru_) flags |= _h_;
	TESTSET(RUMPUSER_OPEN_CREATE, O_CREAT);
	TESTSET(RUMPUSER_OPEN_EXCL, O_EXCL);
#undef TESTSET

	KLOCK_WRAP(fd = open(path, flags, 0644));
	if (fd == -1) {
		rv = errno;
	} else {
		*fdp = fd;
		rv = 0;
	}

 out:
	ET(rv);
}