From: Jiri Denemark Date: Mon, 22 Apr 2013 16:16:57 +0000 (+0200) Subject: qemu: Move QEMU log reading into a separate function X-Git-Tag: v1.0.5-rc1~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e4bdba8d7f86d2b0ea224b64e336b36ef52f6276;p=thirdparty%2Flibvirt.git qemu: Move QEMU log reading into a separate function --- 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"),