[libvirt] [PATCH V2 3/4] Add convertion domxml USB config to/from xl.cfg

Jim Fehlig jfehlig at suse.com
Fri May 20 22:13:58 UTC 2016


In subject, s/convertion/conversion of/

Otherwise, looks good.

Regards,
Jim

On 05/19/2016 02:14 AM, Chunyan Liu wrote:
> xl.cfg:
> usbdev = [ "hostbus=1,hostaddr=3" ]
>
> usb.xml:
>   <hostdev mode='subsystem' type='usb' managed='no'>
>     <source>
>       <address bus='1' device='3'/>
>     </source>
>   </hostdev>
>
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
>  src/xenconfig/xen_xl.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 151 insertions(+)
>
> diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
> index 15350f9..11e90b6 100644
> --- a/src/xenconfig/xen_xl.c
> +++ b/src/xenconfig/xen_xl.c
> @@ -485,6 +485,85 @@ xenParseXLInputDevs(virConfPtr conf, virDomainDefPtr def)
>      return 0;
>  }
>  
> +static int
> +xenParseXLUSB(virConfPtr conf, virDomainDefPtr def)
> +{
> +    virConfValuePtr list = virConfGetValue(conf, "usbdev");
> +    virDomainHostdevDefPtr hostdev = NULL;
> +
> +    if (list && list->type == VIR_CONF_LIST) {
> +        list = list->list;
> +        while (list) {
> +            char bus[3];
> +            char device[3];
> +            char *key;
> +            int busNum;
> +            int devNum;
> +
> +            bus[0] = device[0] = '\0';
> +
> +            if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
> +                goto skipusb;
> +            /* usbdev=['hostbus=1,hostaddr=3'] */
> +            key = list->str;
> +            while (key) {
> +                char *data;
> +                char *nextkey = strchr(key, ',');
> +
> +                if (!(data = strchr(key, '=')))
> +                    goto skipusb;
> +                data++;
> +
> +                if (STRPREFIX(key, "hostbus=")) {
> +                    int len = nextkey ? (nextkey - data) : sizeof(bus) - 1;
> +                    if (virStrncpy(bus, data, len, sizeof(bus)) == NULL) {
> +                        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                                       _("bus %s too big for destination"),
> +                                       data);
> +                        goto skipusb;
> +                    }
> +                } else if (STRPREFIX(key, "hostaddr=")) {
> +                    int len = nextkey ? (nextkey - data) : sizeof(device) - 1;
> +                    if (virStrncpy(device, data, len, sizeof(device)) == NULL) {
> +                        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                                       _("device %s too big for destination"),
> +                                       data);
> +                        goto skipusb;
> +                    }
> +                }
> +
> +                while (nextkey && (nextkey[0] == ',' ||
> +                                   nextkey[0] == ' ' ||
> +                                   nextkey[0] == '\t'))
> +                    nextkey++;
> +                key = nextkey;
> +            }
> +
> +            if (virStrToLong_i(bus, NULL, 16, &busNum) < 0)
> +                goto skipusb;
> +            if (virStrToLong_i(device, NULL, 16, &devNum) < 0)
> +                goto skipusb;
> +            if (!(hostdev = virDomainHostdevDefAlloc(NULL)))
> +               return -1;
> +
> +            hostdev->managed = false;
> +            hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB;
> +            hostdev->source.subsys.u.usb.bus = busNum;
> +            hostdev->source.subsys.u.usb.device = devNum;
> +
> +            if (VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev) < 0) {
> +                virDomainHostdevDefFree(hostdev);
> +                return -1;
> +            }
> +
> +        skipusb:
> +            list = list->next;
> +        }
> +    }
> +
> +    return 0;
> +}
> +
>  virDomainDefPtr
>  xenParseXL(virConfPtr conf,
>             virCapsPtr caps,
> @@ -513,6 +592,9 @@ xenParseXL(virConfPtr conf,
>      if (xenParseXLInputDevs(conf, def) < 0)
>          goto cleanup;
>  
> +    if (xenParseXLUSB(conf, def) < 0)
> +        goto cleanup;
> +
>      if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE,
>                                xmlopt) < 0)
>          goto cleanup;
> @@ -984,6 +1066,72 @@ xenFormatXLInputDevs(virConfPtr conf, virDomainDefPtr def)
>      return -1;
>  }
>  
> +static int
> +xenFormatXLUSB(virConfPtr conf,
> +               virDomainDefPtr def)
> +{
> +    virConfValuePtr usbVal = NULL;
> +    int hasUSB = 0;
> +    size_t i;
> +
> +    for (i = 0; i < def->nhostdevs; i++) {
> +        if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
> +            def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
> +            hasUSB = 1;
> +            break;
> +        }
> +    }
> +
> +    if (!hasUSB)
> +        return 0;
> +
> +    if (VIR_ALLOC(usbVal) < 0)
> +        return -1;
> +
> +    usbVal->type = VIR_CONF_LIST;
> +    usbVal->list = NULL;
> +
> +    for (i = 0; i < def->nhostdevs; i++) {
> +        if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
> +            def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
> +            virConfValuePtr val, tmp;
> +            char *buf;
> +
> +            if (virAsprintf(&buf, "hostbus=%x,hostaddr=%x",
> +                            def->hostdevs[i]->source.subsys.u.usb.bus,
> +                            def->hostdevs[i]->source.subsys.u.usb.device) < 0)
> +                goto error;
> +
> +            if (VIR_ALLOC(val) < 0) {
> +                VIR_FREE(buf);
> +                goto error;
> +            }
> +            val->type = VIR_CONF_STRING;
> +            val->str = buf;
> +            tmp = usbVal->list;
> +            while (tmp && tmp->next)
> +                tmp = tmp->next;
> +            if (tmp)
> +                tmp->next = val;
> +            else
> +                usbVal->list = val;
> +        }
> +    }
> +
> +    if (usbVal->list != NULL) {
> +        int ret = virConfSetValue(conf, "usbdev", usbVal);
> +        usbVal = NULL;
> +        if (ret < 0)
> +            return -1;
> +    }
> +    VIR_FREE(usbVal);
> +
> +    return 0;
> +
> + error:
> +    virConfFreeValue(usbVal);
> +    return -1;
> +}
>  
>  virConfPtr
>  xenFormatXL(virDomainDefPtr def, virConnectPtr conn)
> @@ -1008,6 +1156,9 @@ xenFormatXL(virDomainDefPtr def, virConnectPtr conn)
>      if (xenFormatXLInputDevs(conf, def) < 0)
>          goto cleanup;
>  
> +    if (xenFormatXLUSB(conf, def) < 0)
> +        goto cleanup;
> +
>      return conf;
>  
>   cleanup:




More information about the libvir-list mailing list