By checking the pid every retry period, we can quickly determine if
the process crashed at startup, rather than make the user wait for
the entire timeout (3 seconds).
---
src/qemu_driver.c | 33 ++++++++++++++++++++++-----------
1 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 2f17f6c..04df8ae 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -744,29 +744,40 @@ qemudReadLogOutput(virConnectPtr conn,
int timeout)
{
int retries = timeout*10;
+ int got = 0;
buf[0] = '\0';
while (retries) {
ssize_t ret;
- size_t got = 0;
+ int isdead = 0;
- 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;
- }
- }
+ if (kill(vm->pid, 0) == -1 && errno == ESRCH)
+ isdead = 1;
- if (ret < 0 && errno != EINTR) {
+ ret = saferead(fd, buf+got, buflen-got-1);
+ if (ret < 0) {
virReportSystemError(conn, errno,
_("Failure while reading %s log output"),
what);
return -1;
}
+ got += ret;
+ buf[got] = '\0';
+ if (got == buflen-1) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("Out of space while reading %s log output"),
+ what);
+ return -1;
+ }
+
+ if (isdead) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("Process exited while reading %s log output"),
+ what);
+ return -1;
+ }
+
ret = func(conn, vm, buf, fd);
if (ret <= 0)
return ret;
--
1.6.2.2