[libvirt] [PATCH] qemu: Adapt to new log format

Osier Yang jyang at redhat.com
Sun Dec 30 09:25:42 UTC 2012


On 2012年12月29日 17:09, Michal Privoznik wrote:
> Since 586502189edf9fd0f89a83de96717a2ea826fdb0 qemu commit, the log
> lines reporting chardev's path has changed from:
>
> $ ./x86_64-softmmu/qemu-system-x86_64 -serial pty -serial pty -monitor pty
> char device redirected to /dev/pts/5
> char device redirected to /dev/pts/6
> char device redirected to /dev/pts/7
>
> to:
>
> $ ./x86_64-softmmu/qemu-system-x86_64 -serial pty -serial pty -monitor pty
> char device compat_monitor0 redirected to /dev/pts/5
> char device serial0 redirected to /dev/pts/6
> char device serial1 redirected to /dev/pts/7
>
> However, with current code we are not prepared for such change, which
> results in us being unable to start any domain.
> ---
>   src/qemu/qemu_process.c | 33 +++++++++++++++++++++++++++++----
>   1 file changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index eac6553..29bd082 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1431,22 +1431,43 @@ cleanup:
>    *
>    * char device redirected to /dev/pts/3
>    *
> + * However, since 1.4 the line we are looking for has changed to:
> + *
> + * char device<alias>  redirected to /some/path
> + *
>    * Returns -1 for error, 0 success, 1 continue reading
>    */
>   static int
>   qemuProcessExtractTTYPath(const char *haystack,
>                             size_t *offset,
> +                          const char *alias,
>                             char **path)
>   {
> -    static const char needle[] = "char device redirected to";
> -    char *tmp, *dev;
> +    static const char *needle[] = {"char device", "redirected to"};
> +    const char *tmp, *dev;
>
>       VIR_FREE(*path);
>       /* First look for our magic string */
> -    if (!(tmp = strstr(haystack + *offset, needle))) {
> +    if (!(tmp = strstr(haystack + *offset, needle[0])))
>           return 1;
> +
> +    tmp += strlen(needle[0]);
> +    virSkipSpaces(&tmp);
> +
> +    if (STRPREFIX(tmp, "char")) {

I don't see why it's the new style with "char" here with regard
to the new output string like "char device serial1 redirected
to /dev/pts/7". Should it be below instead?

        if (!STRPREFIX(tmp, "redirected"))
or
        if (STRPREFIX(tmp, alias))

> +        /* we are dealing with new style */
> +        tmp += strlen("char");
> +        if (!STRPREFIX(tmp, alias))
> +            return 1;
> +
> +        tmp += strlen(alias);
> +        virSkipSpaces(&tmp);
>       }
> -    tmp += sizeof(needle);
> +
> +    if (!STRPREFIX(tmp, needle[1]))
> +        return 1;
> +
> +    tmp += strlen(needle[1]);
>       dev = tmp;
>
>       /*
> @@ -1569,6 +1590,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
>           virDomainChrDefPtr chr = vm->def->serials[i];
>           if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
>               if ((ret = qemuProcessExtractTTYPath(output,&offset,
> +                                                 chr->info.alias,
>                                                    &chr->source.data.file.path)) != 0)
>                   return ret;
>           }
> @@ -1579,6 +1601,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
>           virDomainChrDefPtr chr = vm->def->parallels[i];
>           if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
>               if ((ret = qemuProcessExtractTTYPath(output,&offset,
> +                                                 chr->info.alias,
>                                                    &chr->source.data.file.path)) != 0)
>                   return ret;
>           }
> @@ -1589,6 +1612,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
>           virDomainChrDefPtr chr = vm->def->channels[i];
>           if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
>               if ((ret = qemuProcessExtractTTYPath(output,&offset,
> +                                                 chr->info.alias,
>                                                    &chr->source.data.file.path)) != 0)
>                   return ret;
>           }
> @@ -1608,6 +1632,7 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
>               if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY&&
>                   chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) {
>                   if ((ret = qemuProcessExtractTTYPath(output,&offset,
> +                                                     chr->info.alias,
>                                                        &chr->source.data.file.path)) != 0)
>                       return ret;
>               }




More information about the libvir-list mailing list