[libvirt] [PATCH 2/6] Probe for QEMU machine types

Daniel Veillard veillard at redhat.com
Mon Jul 27 09:47:06 UTC 2009


On Thu, Jul 23, 2009 at 06:34:40PM +0100, Mark McLoughlin wrote:
> Currently we hardcode the QEMU machine types. We should really just
> parse the output of 'qemu -M ?' so the lists don't get out of sync.

  yes that makes sense, maintaining that list in libvirt itself
is a garanteed way to break things, just looking at the current version
our ppc list lists only 3 machine types while the binary reports 7 !

> xenner doesn't support '-M ?', so we still need to hardcode that.
> 
> The horrible (const char *const *) is removed in a subsequent patch.
> 
> * src/qemu_conf.c: kill the arch_info*machines tables, retain the
>   hardcoded xenner machine type, add qemudProbeMachineTypes() to
>   run and parse 'qemu -M ?' and use it in qemudCapsInitGuest()
> ---
[...]
> +static int
> +qemudParseMachineTypesStr(const char *output,
> +                          char ***machines,
> +                          int *nmachines)
> +{
> +    const char *p = output;
> +    const char *next;
> +    char **list = NULL;
> +    int i, nitems = 0;
> +
> +    do {
> +        const char *t;
> +        char *machine;
> +
> +        if ((next = strchr(p, '\n')))
> +            ++next;
> +
> +        if (STRPREFIX(p, "Supported machines are:"))
> +            continue;

  It's supposed to happen only on the first line, maybe suppressing the
first line if it ends with ':' is a safer bet in case the description
changes in the future (might be localized for example). But good enough
for now, if only they had used a structured description ...

> +        if (!(t = strchr(p, ' ')) || (next && t >= next))
> +            continue;

  Are we garanteed it will always be spaces, seems the case in what I
looked but maybe tabs might break this code. Still good enough for now.

> +        if (!(machine = strndup(p, t - p)))
> +            goto error;
> +
> +        if (VIR_REALLOC_N(list, nitems + 1) < 0) {
> +            VIR_FREE(machine);
> +            goto error;
> +        }

  Realloc in a loop, but I don't see how to avoid this except going
twice though the loop ... anyway this should be small and infrequent.

[...]
> +static int
> +qemudProbeMachineTypes(const char *binary,
> +                       char ***machines,
> +                       int *nmachines)
> +{
> +    const char *const qemuarg[] = { binary, "-M", "?", NULL };
> +    const char *const qemuenv[] = { "LC_ALL=C", NULL };

  okay we force the locale ...

ACK, this is really an improvement, just that parsing unstructured data sucks,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list