Guido Günther <agx(a)sigxcpu.org> wrote:
...
>From 6655474aed6e601a6c2e16e7020589f51f58893b Mon Sep 17 00:00:00
2001
From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx(a)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';