On Mon, 5 Sep 2011, M. Mohan Kumar wrote: > Signed-off-by: M. Mohan Kumar <mo...@in.ibm.com> > --- > osdep.c | 32 ++++++++++++++++++++++++++++++++ > qemu-common.h | 2 ++ > 2 files changed, 34 insertions(+), 0 deletions(-) > > diff --git a/osdep.c b/osdep.c > index 56e6963..5a4d670 100644 > --- a/osdep.c > +++ b/osdep.c > @@ -126,6 +126,38 @@ ssize_t qemu_write_full(int fd, const void *buf, size_t > count) > } > > /* > + * A variant of read(2) which handles interrupted read. > + * Simlar to qemu_write_full function > + * > + * Return the number of bytes read. > + * > + * This function does not work with non-blocking fd's. > + * errno is set if fewer than `count' bytes are read because of any > + * error > + */ > +ssize_t qemu_read_full(int fd, void *buf, size_t count) > +{ > + ssize_t ret = 0; > + ssize_t total = 0; > + > + while (count) { > + ret = read(fd, buf, count); > + if (ret <= 0) { > + if (errno == EINTR) {
ret == 0 is not an error so here the stale value of errno is checked, iow this is wrong and recipe for an endless loop. > + continue; > + } > + break; > + } > + > + count -= ret; > + buf += ret; > + total += ret; > + } > + > + return total; > +} > + > +/* > * Opens a socket with FD_CLOEXEC set > */ > int qemu_socket(int domain, int type, int protocol) > diff --git a/qemu-common.h b/qemu-common.h > index 404c421..d6aabd2 100644 > --- a/qemu-common.h > +++ b/qemu-common.h > @@ -189,6 +189,8 @@ 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_read_full(int fd, void *buf, size_t count) > + QEMU_WARN_UNUSED_RESULT; > void qemu_set_cloexec(int fd); > > #ifndef _WIN32 > -- mailto:av1...@comtv.ru