[libvirt] Re: [PATCH] use qemudReadLogOutput
Jim Meyering
jim at meyering.net
Fri Feb 13 18:07:49 UTC 2009
Guido Günther <agx at sigxcpu.org> wrote:
...
>>From 6655474aed6e601a6c2e16e7020589f51f58893b Mon Sep 17 00:00:00 2001
> From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx at sigxcpu.org>
> Date: Sat, 7 Feb 2009 17:16:39 +0100
> Subject: [PATCH] usleep to wait for domain logfile to fill up
>
> ---
> src/qemu_driver.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++------
> 1 files changed, 57 insertions(+), 8 deletions(-)
>
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index 47ca6c7..09be3fb 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -601,6 +601,7 @@ qemudReadMonitorOutput(virConnectPtr conn,
> {
> int got = 0;
> buf[0] = '\0';
> + timeout *= 1000; /* poll wants milli seconds */
>
> /* Consume & discard the initial greeting */
> while (got < (buflen-1)) {
> @@ -662,6 +663,56 @@ qemudReadMonitorOutput(virConnectPtr conn,
>
> }
>
> +
> +/*
> + * Returns -1 for error, 0 on success
> + */
> +static int
> +qemudReadLogOutput(virConnectPtr conn,
> + virDomainObjPtr vm,
> + int fd,
> + char *buf,
> + int buflen,
> + qemudHandlerMonitorOutput func,
> + const char *what,
> + int timeout)
> +{
> + int got = 0;
> + int ret;
> + int retries = timeout*10;
> + buf[0] = '\0';
> +
> + while (retries) {
> + while((ret = read(fd, buf+got, buflen-got-1)) > 0) {
> + got += ret;
> + buf[got] = '\0';
> + if ((buflen-got-1) == 0) {
> + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> + _("Out of space while reading %s log output"), what);
> + return -1;
> + }
> + }
Hi Guido,
Sorry I didn't review this sooner,
but I looked just today after you committed it.
Here's a proposed patch to make it use better types
(always suspect that using "int" is wrong ;-).
Also, shouldn't it handle read failing with EAGAIN?
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 09be3fb..ae393be 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -672,17 +672,17 @@ qemudReadLogOutput(virConnectPtr conn,
virDomainObjPtr vm,
int fd,
char *buf,
- int buflen,
+ size_t buflen,
qemudHandlerMonitorOutput func,
const char *what,
int timeout)
{
- int got = 0;
- int ret;
int retries = timeout*10;
buf[0] = '\0';
while (retries) {
+ ssize_t ret;
+ size_t got = 0;
while((ret = read(fd, buf+got, buflen-got-1)) > 0) {
got += ret;
buf[got] = '\0';
More information about the libvir-list
mailing list