[libvirt] [PATCH 06.1/10] xenconfig: add support for multiple USB devices syntax
Jim Fehlig
jfehlig at suse.com
Fri Feb 20 23:10:47 UTC 2015
Marek Marczykowski-Górecki wrote:
> In Xen>=4.3, libxl supports new syntax for USB devices:
> usbdevice=[ "DEVICE", "DEVICE", ... ]
> Add support for that in xenconfig driver. When only one device is
> defined, keep using old syntax for backward compatibility.
>
Cool, thanks for doing this! But I have a "small" nit...
> Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
> ---
> src/xenconfig/xen_common.c | 108 +++++++++++++++++++++++++++++++--------------
>
xm only supported the usbdevice=DEVICE syntax, but the code in
xen_common is used to parse/format both xm and xl config. I think
parsing/formating of these devices should be moved to xen-xm and xen-xl.
Regards,
Jim
> 1 file changed, 76 insertions(+), 32 deletions(-)
>
> diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
> index a2a1474..4494f1d 100644
> --- a/src/xenconfig/xen_common.c
> +++ b/src/xenconfig/xen_common.c
> @@ -964,6 +964,7 @@ static int
> xenParseEmulatedDevices(virConfPtr conf, virDomainDefPtr def)
> {
> const char *str;
> + virConfValuePtr val;
>
> if (STREQ(def->os.type, "hvm")) {
> if (xenConfigGetString(conf, "soundhw", &str, NULL) < 0)
> @@ -973,31 +974,42 @@ xenParseEmulatedDevices(virConfPtr conf, virDomainDefPtr def)
> xenParseSxprSound(def, str) < 0)
> return -1;
>
> - if (xenConfigGetString(conf, "usbdevice", &str, NULL) < 0)
> - return -1;
>
> - if (str &&
> - (STREQ(str, "tablet") ||
> - STREQ(str, "mouse") ||
> - STREQ(str, "keyboard"))) {
> - virDomainInputDefPtr input;
> - if (VIR_ALLOC(input) < 0)
> - return -1;
> -
> - input->bus = VIR_DOMAIN_INPUT_BUS_USB;
> - if (STREQ(str, "mouse"))
> - input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
> - else if (STREQ(str, "tablet"))
> - input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
> - else if (STREQ(str, "keyboard"))
> - input->type = VIR_DOMAIN_INPUT_TYPE_KBD;
> - if (VIR_ALLOC_N(def->inputs, 1) < 0) {
> - virDomainInputDefFree(input);
> + val = virConfGetValue(conf, "usbdevice");
> + /* usbdevice can be defined as either a single string or a list */
> + if (val && val->type == VIR_CONF_LIST)
> + val = val->list;
> + /* otherwise val->next is NULL, so can be handled by the same code */
> + while (val) {
> + if (val->type != VIR_CONF_STRING) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("config value %s was malformed"),
> + "usbdevice");
> return -1;
> + }
> + str = val->str;
> +
> + if (str &&
> + (STREQ(str, "tablet") ||
> + STREQ(str, "mouse") ||
> + STREQ(str, "keyboard"))) {
> + virDomainInputDefPtr input;
> + if (VIR_ALLOC(input) < 0)
> + return -1;
>
> + input->bus = VIR_DOMAIN_INPUT_BUS_USB;
> + if (STREQ(str, "mouse"))
> + input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
> + else if (STREQ(str, "tablet"))
> + input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
> + else if (STREQ(str, "keyboard"))
> + input->type = VIR_DOMAIN_INPUT_TYPE_KBD;
> + if (VIR_APPEND_ELEMENT(def->inputs, def->ninputs, input) < 0) {
> + virDomainInputDefFree(input);
> + return -1;
> + }
> }
> - def->inputs[0] = input;
> - def->ninputs = 1;
> + val = val->next;
> }
> }
>
> @@ -1953,36 +1965,68 @@ static int
> xenFormatInputDevs(virConfPtr conf, virDomainDefPtr def)
> {
> size_t i;
> + const char *devtype;
> + virConfValuePtr usbdevices = NULL, lastdev;
>
> if (STREQ(def->os.type, "hvm")) {
> + if (VIR_ALLOC(usbdevices) < 0)
> + goto error;
> +
> + usbdevices->type = VIR_CONF_LIST;
> + usbdevices->list = NULL;
> + lastdev = NULL;
> for (i = 0; i < def->ninputs; i++) {
> if (def->inputs[i]->bus == VIR_DOMAIN_INPUT_BUS_USB) {
> if (xenConfigSetInt(conf, "usb", 1) < 0)
> - return -1;
> + goto error;
>
> switch (def->inputs[i]->type) {
> case VIR_DOMAIN_INPUT_TYPE_MOUSE:
> - if (xenConfigSetString(conf, "usbdevice", "mouse") < 0)
> - return -1;
> -
> + devtype = "mouse";
> break;
> case VIR_DOMAIN_INPUT_TYPE_TABLET:
> - if (xenConfigSetString(conf, "usbdevice", "tablet") < 0)
> - return -1;
> -
> + devtype = "tablet";
> break;
> case VIR_DOMAIN_INPUT_TYPE_KBD:
> - if (xenConfigSetString(conf, "usbdevice", "keyboard") < 0)
> - return -1;
> -
> + devtype = "keyboard";
> break;
> + default:
> + continue;
> }
> - break;
> +
> + if (lastdev == NULL) {
> + if (VIR_ALLOC(lastdev) < 0)
> + goto error;
> + usbdevices->list = lastdev;
> + } else {
> + if (VIR_ALLOC(lastdev->next) < 0)
> + goto error;
> + lastdev = lastdev->next;
> + }
> + lastdev->type = VIR_CONF_STRING;
> + if (VIR_STRDUP(lastdev->str, devtype) < 0)
> + goto error;
> }
> }
> + if (usbdevices->list != NULL) {
> + if (usbdevices->list->next == NULL) {
> + /* for compatibility with Xen <= 4.2, use old syntax when
> + * only one device present */
> + if (xenConfigSetString(conf, "usbdevice", usbdevices->list->str) < 0)
> + goto error;
> + virConfFreeValue(usbdevices);
> + } else {
> + virConfSetValue(conf, "usbdevice", usbdevices);
> + }
> + } else {
> + VIR_FREE(usbdevices);
> + }
> }
>
> return 0;
> + error:
> + virConfFreeValue(usbdevices);
> + return -1;
> }
>
>
>
More information about the libvir-list
mailing list