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; }
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); }