mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
win32: add readv/writev emulation
Commit e9d8fbf
(qemu-file: do not use stdio for qemu_fdopen, 2013-03-27)
introduced a usage of writev, which mingw32 does not have. Even though
qemu_fdopen itself is not used on mingw32, the future-proof solution is
to add an implementation of it. This is simple and similar to how we
emulate sendmsg/recvmsg in util/iov.c.
Some files include osdep.h without qemu-common.h, so move the definition
of iovec to osdep.h too, and include osdep.h from qemu-common.h
unconditionally (protection against including files when NEED_CPU_H is
defined is not needed since the removal of AREG0).
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c12915e638
commit
9adea5f7f7
4 changed files with 63 additions and 21 deletions
|
@ -99,7 +99,7 @@ size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
|
|||
static ssize_t
|
||||
do_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt, bool do_send)
|
||||
{
|
||||
#if defined CONFIG_IOVEC && defined CONFIG_POSIX
|
||||
#ifdef CONFIG_POSIX
|
||||
ssize_t ret;
|
||||
struct msghdr msg;
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
|
|
43
util/osdep.c
43
util/osdep.c
|
@ -429,3 +429,46 @@ int socket_init(void)
|
|||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_IOVEC
|
||||
/* helper function for iov_send_recv() */
|
||||
static ssize_t
|
||||
readv_writev(int fd, const struct iovec *iov, int iov_cnt, bool do_write)
|
||||
{
|
||||
unsigned i = 0;
|
||||
ssize_t ret = 0;
|
||||
while (i < iov_cnt) {
|
||||
ssize_t r = do_write
|
||||
? write(fd, iov[i].iov_base, iov[i].iov_len)
|
||||
: read(fd, iov[i].iov_base, iov[i].iov_len);
|
||||
if (r > 0) {
|
||||
ret += r;
|
||||
} else if (!r) {
|
||||
break;
|
||||
} else if (errno == EINTR) {
|
||||
continue;
|
||||
} else {
|
||||
/* else it is some "other" error,
|
||||
* only return if there was no data processed. */
|
||||
if (ret == 0) {
|
||||
ret = -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
readv(int fd, const struct iovec *iov, int iov_cnt)
|
||||
{
|
||||
return readv_writev(fd, iov, iov_cnt, false);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
writev(int fd, const struct iovec *iov, int iov_cnt)
|
||||
{
|
||||
return readv_writev(fd, iov, iov_cnt, true);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue