Message ID | 1317799065-29668-4-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Am 05.10.2011 09:17, schrieb Paolo Bonzini: > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > osdep.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > qemu-common.h | 4 +++ > 2 files changed, 71 insertions(+), 0 deletions(-) > > diff --git a/osdep.c b/osdep.c > index 56e6963..718a25d 100644 > --- a/osdep.c > +++ b/osdep.c > @@ -166,3 +166,70 @@ int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen) > > return ret; > } > + > +/* > + * A variant of send(2) which handles partial write. > + * > + * Return the number of bytes transferred, which is only > + * smaller than `count' if there is an error. > + * > + * This function won't work with non-blocking fd's. > + * Any of the possibilities with non-bloking fd's is bad: > + * - return a short write (then name is wrong) > + * - busy wait adding (errno == EAGAIN) to the loop > + */ > +ssize_t qemu_send_full(int fd, const void *buf, size_t count, int flags) > +{ > + ssize_t ret = 0; > + ssize_t total = 0; > + > + while (count) { > + ret = send(fd, buf, count, flags); > + if (ret < 0) { > + if (errno == EINTR) { > + continue; > + } > + break; > + } > + > + count -= ret; > + buf += ret; > + total += ret; > + } > + > + return total; > +} > + > +/* > + * A variant of recv(2) which handles partial write. > + * > + * Return the number of bytes transferred, which is only > + * smaller than `count' if there is an error. > + * > + * This function won't work with non-blocking fd's. > + * Any of the possibilities with non-bloking fd's is bad: > + * - return a short write (then name is wrong) > + * - busy wait adding (errno == EAGAIN) to the loop > + */ > +ssize_t qemu_recv_full(int fd, const void *buf, size_t count, int flags) > +{ > + ssize_t ret = 0; > + ssize_t total = 0; > + > + while (count) { > + ret = recv(fd, buf, count, flags); osdep.c: In function 'qemu_recv_full': osdep.c:220: error: passing argument 2 of 'recv' discards qualifiers from pointer target type /usr/include/bits/socket2.h:35: note: expected 'void *' but argument is of type 'const void *' Kevin
diff --git a/osdep.c b/osdep.c index 56e6963..718a25d 100644 --- a/osdep.c +++ b/osdep.c @@ -166,3 +166,70 @@ int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen) return ret; } + +/* + * A variant of send(2) which handles partial write. + * + * Return the number of bytes transferred, which is only + * smaller than `count' if there is an error. + * + * This function won't work with non-blocking fd's. + * Any of the possibilities with non-bloking fd's is bad: + * - return a short write (then name is wrong) + * - busy wait adding (errno == EAGAIN) to the loop + */ +ssize_t qemu_send_full(int fd, const void *buf, size_t count, int flags) +{ + ssize_t ret = 0; + ssize_t total = 0; + + while (count) { + ret = send(fd, buf, count, flags); + if (ret < 0) { + if (errno == EINTR) { + continue; + } + break; + } + + count -= ret; + buf += ret; + total += ret; + } + + return total; +} + +/* + * A variant of recv(2) which handles partial write. + * + * Return the number of bytes transferred, which is only + * smaller than `count' if there is an error. + * + * This function won't work with non-blocking fd's. + * Any of the possibilities with non-bloking fd's is bad: + * - return a short write (then name is wrong) + * - busy wait adding (errno == EAGAIN) to the loop + */ +ssize_t qemu_recv_full(int fd, const void *buf, size_t count, int flags) +{ + ssize_t ret = 0; + ssize_t total = 0; + + while (count) { + ret = recv(fd, buf, count, flags); + if (ret <= 0) { + if (ret < 0 && errno == EINTR) { + continue; + } + break; + } + + count -= ret; + buf += ret; + total += ret; + } + + return total; +} + diff --git a/qemu-common.h b/qemu-common.h index 5e87bdf..ed9112a 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -189,6 +189,10 @@ void qemu_mutex_unlock_iothread(void); int qemu_open(const char *name, int flags, ...); ssize_t qemu_write_full(int fd, const void *buf, size_t count) QEMU_WARN_UNUSED_RESULT; +ssize_t qemu_send_full(int fd, const void *buf, size_t count, int flags) + QEMU_WARN_UNUSED_RESULT; +ssize_t qemu_recv_full(int fd, const void *buf, size_t count, int flags) + QEMU_WARN_UNUSED_RESULT; void qemu_set_cloexec(int fd); #ifndef _WIN32
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- osdep.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qemu-common.h | 4 +++ 2 files changed, 71 insertions(+), 0 deletions(-)