From e4bdba8d7f86d2b0ea224b64e336b36ef52f6276 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Mon, 22 Apr 2013 18:16:57 +0200 Subject: [PATCH] qemu: Move QEMU log reading into a separate function --- src/qemu/qemu_process.c | 61 +++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ce9f50171a..a1fbd5f681 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1346,6 +1346,41 @@ error: return ret; } +static int +qemuProcessReadLog(int fd, char *buf, int buflen, int off) +{ + char *filter_next = buf; + ssize_t bytes; + char *eol; + + buf[0] = '\0'; + + while (off < buflen - 1) { + bytes = saferead(fd, buf + off, buflen - off - 1); + if (bytes < 0) + return -1; + else if (bytes == 0) + break; + + off += bytes; + buf[off] = '\0'; + + /* Filter out debug messages from intermediate libvirt process */ + while ((eol = strchr(filter_next, '\n'))) { + *eol = '\0'; + if (virLogProbablyLogMessage(filter_next)) { + memmove(filter_next, eol + 1, off - (eol - buf)); + off -= eol + 1 - filter_next; + } else { + filter_next = eol + 1; + *eol = '\n'; + } + } + } + + return off; +} + typedef int qemuProcessLogHandleOutput(virDomainObjPtr vm, const char *output, int fd); @@ -1365,46 +1400,26 @@ qemuProcessReadLogOutput(virDomainObjPtr vm, int retries = (timeout*10); int got = 0; int ret = -1; - char *filter_next = buf; buf[0] = '\0'; while (retries) { - ssize_t func_ret, bytes; + ssize_t func_ret; int isdead = 0; - char *eol; func_ret = func(vm, buf, fd); if (kill(vm->pid, 0) == -1 && errno == ESRCH) isdead = 1; - /* Any failures should be detected before we read the log, so we - * always have something useful to report on failure. */ - bytes = saferead(fd, buf+got, buflen-got-1); - if (bytes < 0) { + got = qemuProcessReadLog(fd, buf, buflen, got); + if (got < 0) { virReportSystemError(errno, _("Failure while reading %s log output"), what); goto cleanup; } - got += bytes; - buf[got] = '\0'; - - /* Filter out debug messages from intermediate libvirt process */ - while ((eol = strchr(filter_next, '\n'))) { - *eol = '\0'; - VIR_ERROR("<<<<<<<<<<<<%s>>>>>>>>>>", filter_next); - if (virLogProbablyLogMessage(filter_next)) { - memmove(filter_next, eol + 1, got - (eol - buf)); - got -= eol + 1 - filter_next; - } else { - filter_next = eol + 1; - *eol = '\n'; - } - } - if (got == buflen-1) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Out of space while reading %s log output: %s"), -- GitLab