diff --git a/ChangeLog b/ChangeLog index d43ea5fd61..3157b92e3e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon May 11 09:51:00 EDT 2009 Cole Robinson + + * src/qemu_driver.c : Check that QEMU is still alive while + reading startup output. + Mon May 11 09:44:40 EDT 2009 Cole Robinson * src/util.[ch] : Add pidfile argument to __virExec diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 61a7cf1d47..30642d5009 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;