[libvirt] [PATCH v8 4/8] parallels: get info about serial ports

Peter Krempa pkrempa at redhat.com
Fri Jul 13 10:01:10 UTC 2012


On 07/04/12 19:42, Dmitry Guryanov wrote:
> Add support of collecting information about serial
> ports. This change is needed mostly as an example,
> support of other devices will be added later.
>
> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
> ---
>   src/parallels/parallels_driver.c |  119 ++++++++++++++++++++++++++++++++++++++
>   1 files changed, 119 insertions(+), 0 deletions(-)
>
> diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
> index 8fadd79..270ac21 100644
> --- a/src/parallels/parallels_driver.c
> +++ b/src/parallels/parallels_driver.c
> @@ -143,6 +143,122 @@ parallelsGetCapabilities(virConnectPtr conn)
>       return xml;
>   }
>
> +static int
> +parallelsGetSerialInfo(virDomainChrDefPtr chr,
> +                 const char *name, virJSONValuePtr value)
> +{
> +    const char *tmp;
> +
> +    chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
> +    chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
> +    if (virStrToLong_i(name + strlen("serial"),
> +                       NULL, 10, &chr->target.port) < 0) {
> +        parallelsParseError();
> +        return -1;
> +    }
> +
> +    if (virJSONValueObjectHasKey(value, "output")) {
> +        chr->source.type = VIR_DOMAIN_CHR_TYPE_FILE;
> +
> +        tmp = virJSONValueObjectGetString(value, "output");
> +        if (!tmp) {
> +            parallelsParseError();
> +            return -1;
> +        }
> +
> +        if (!(chr->source.data.file.path = strdup(tmp)))
> +            goto no_memory;
> +    } else if (virJSONValueObjectHasKey(value, "socket")) {
> +        chr->source.type = VIR_DOMAIN_CHR_TYPE_UNIX;
> +
> +        tmp = virJSONValueObjectGetString(value, "socket");
> +        if (!tmp) {
> +            parallelsParseError();
> +            return -1;
> +        }
> +
> +        if (!(chr->source.data.nix.path = strdup(tmp)))
> +            goto no_memory;
> +        chr->source.data.nix.listen = false;
> +    } else if (virJSONValueObjectHasKey(value, "real")) {
> +        chr->source.type = VIR_DOMAIN_CHR_TYPE_DEV;
> +
> +        tmp = virJSONValueObjectGetString(value, "real");
> +        if (!tmp) {
> +            parallelsParseError();
> +            return -1;
> +        }
> +
> +        if (!(chr->source.data.file.path = strdup(tmp)))
> +            goto no_memory;
> +    } else {
> +        parallelsParseError();

Maybe sometimes a more specific error message would be great, but not a 
show stopper.

> +        return -1;
> +    }
> +
> +    return 0;
> +
> +  no_memory:
> +    virReportOOMError();
> +    return -1;
> +}
> +
> +static int
> +parallelsAddSerialInfo(virDomainObjPtr dom,
> +                 const char *key, virJSONValuePtr value)
> +{
> +    virDomainDefPtr def = dom->def;
> +    virDomainChrDefPtr chr = NULL;
> +
> +    if (!(chr = virDomainChrDefNew()))
> +        goto no_memory;
> +
> +    if (parallelsGetSerialInfo(chr, key, value))
> +        goto cleanup;
> +
> +    if (VIR_REALLOC_N(def->serials, def->nserials + 1) < 0) {
> +        virDomainChrDefFree(chr);

Freeing chr is not necessary as the next goto solves that.

> +        goto no_memory;
> +    }
> +
> +    def->serials[def->nserials++] = chr;
> +
> +    return 0;
> +
> +  no_memory:
> +    virReportOOMError();
> +  cleanup:
> +    virDomainChrDefFree(chr);
> +    return -1;
> +}
> +
> +static int
> +parallelsAddDomainHardware(virDomainObjPtr dom, virJSONValuePtr jobj)
> +{
> +    int n, i;
> +    virJSONValuePtr value;
> +    const char *key;
> +
> +    n = virJSONValueObjectKeysNumber(jobj);
> +    if (n < 1)
> +        goto cleanup;
> +
> +    for (i = 0; i < n; i++) {
> +        key = virJSONValueObjectGetKey(jobj, i);
> +        value = virJSONValueObjectGetValue(jobj, i);
> +
> +        if (STRPREFIX(key, "serial")) {
> +            if (parallelsAddSerialInfo(dom, key, value))
> +                goto cleanup;
> +        }
> +    }
> +
> +    return 0;
> +
> +  cleanup:
> +    return -1;
> +}
> +
>   /*
>    * Must be called with privconn->lock held
>    */
> @@ -291,6 +407,9 @@ parallelsLoadDomain(parallelsConnPtr privconn, virJSONValuePtr jobj)
>       else
>           dom->autostart = 0;
>
> +    if (parallelsAddDomainHardware(dom, jobj2) < 0)
> +        goto cleanup_unlock;
> +
>       virDomainObjUnlock(dom);
>
>       return dom;
>

Otherwise looks good to me.

Peter




More information about the libvir-list mailing list