}
+static virDomainControllerDefPtr
+virDomainControllerDefNew(virDomainControllerType type)
+{
+ virDomainControllerDefPtr def;
+
+ if (VIR_ALLOC(def) < 0)
+ return NULL;
+
+ def->type = type;
+ def->model = -1;
+
+ /* 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)
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;
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)))
+ goto error;
+
idx = virXMLPropString(node, "index");
if (idx) {
if (virStrToLong_ui(idx, NULL, 10, &def->idx) < 0 ||
_("Unknown model type '%s'"), model);
goto error;
}
- } else {
- def->model = -1;
}
cur = node->children;
VIR_FREE(ports);
goto error;
}
- } else {
- def->opts.vioserial.ports = -1;
}
VIR_FREE(ports);
VIR_FREE(vectors);
goto error;
}
- } else {
- def->opts.vioserial.vectors = -1;
}
VIR_FREE(vectors);
break;
cleanup:
ctxt->node = saved;
- VIR_FREE(type);
+ VIR_FREE(typeStr);
VIR_FREE(idx);
VIR_FREE(model);
VIR_FREE(queues);
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;