[libvirt] [PATCH 1/3] qemu: Move QEMU log reading into a separate function

Osier Yang jyang at redhat.com
Mon Apr 22 17:09:34 UTC 2013


On 23/04/13 00:40, Jiri Denemark wrote:
> ---
>   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 ce9f501..a1fbd5f 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"),

ACK




More information about the libvir-list mailing list