There are some non-0 default values in virDomainControllerDef (and will soon be more) that are easier to not forget if the remembering is done by a single initializer function (rather than inline code after allocating the obejct with generic VIR_ALLOC(). --- new in V2 src/conf/domain_conf.c | 64 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5a9a88d..8dd4bf0 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1527,6 +1527,37 @@ virDomainDiskSetFormat(virDomainDiskDefPtr def, int format) } +static virDomainControllerDefPtr +virDomainControllerDefNew(virDomainControllerType type) +{ + virDomainControllerDefPtr def; + + if (VIR_ALLOC(def) < 0) + return NULL; + + def->type = type; + + /* initialize anything that has a non-0 default */ + switch ((virDomainControllerType) def->type) { + case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: + def->opts.vioserial.ports = -1; + def->opts.vioserial.vectors = -1; + break; + case VIR_DOMAIN_CONTROLLER_TYPE_PCI: + case VIR_DOMAIN_CONTROLLER_TYPE_IDE: + case VIR_DOMAIN_CONTROLLER_TYPE_FDC: + case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: + case VIR_DOMAIN_CONTROLLER_TYPE_SATA: + case VIR_DOMAIN_CONTROLLER_TYPE_CCID: + case VIR_DOMAIN_CONTROLLER_TYPE_USB: + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + break; + } + + return def; +} + + void virDomainControllerDefFree(virDomainControllerDefPtr def) { if (!def) @@ -7597,9 +7628,10 @@ virDomainControllerDefParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt, unsigned int flags) { - virDomainControllerDefPtr def; + virDomainControllerDefPtr def = NULL; + int type = 0; xmlNodePtr cur = NULL; - char *type = NULL; + char *typeStr = NULL; char *idx = NULL; char *model = NULL; char *queues = NULL; @@ -7610,18 +7642,18 @@ virDomainControllerDefParseXML(xmlNodePtr node, ctxt->node = node; - if (VIR_ALLOC(def) < 0) - return NULL; - - type = virXMLPropString(node, "type"); - if (type) { - if ((def->type = virDomainControllerTypeFromString(type)) < 0) { + typeStr = virXMLPropString(node, "type"); + if (typeStr) { + if ((type = virDomainControllerTypeFromString(typeStr)) < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unknown controller type '%s'"), type); + _("Unknown controller type '%s'"), typeStr); goto error; } } + if (!(def = virDomainControllerDefNew(type))) + return NULL; + idx = virXMLPropString(node, "index"); if (idx) { if (virStrToLong_ui(idx, NULL, 10, &def->idx) < 0 || @@ -7692,8 +7724,6 @@ virDomainControllerDefParseXML(xmlNodePtr node, VIR_FREE(ports); goto error; } - } else { - def->opts.vioserial.ports = -1; } VIR_FREE(ports); @@ -7707,8 +7737,6 @@ virDomainControllerDefParseXML(xmlNodePtr node, VIR_FREE(vectors); goto error; } - } else { - def->opts.vioserial.vectors = -1; } VIR_FREE(vectors); break; @@ -7780,7 +7808,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, cleanup: ctxt->node = saved; - VIR_FREE(type); + VIR_FREE(typeStr); VIR_FREE(idx); VIR_FREE(model); VIR_FREE(queues); @@ -13960,18 +13988,12 @@ virDomainDefMaybeAddController(virDomainDefPtr def, return 0; } - if (VIR_ALLOC(cont) < 0) + if (!(cont = virDomainControllerDefNew(type))) return -1; - cont->type = type; cont->idx = idx; cont->model = model; - if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) { - cont->opts.vioserial.ports = -1; - cont->opts.vioserial.vectors = -1; - } - if (VIR_APPEND_ELEMENT(def->controllers, def->ncontrollers, cont) < 0) { VIR_FREE(cont); return -1; -- 2.1.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list