提交 8e2982b5 编写于 作者: C Cole Robinson

conf: Clean up virDomainDefParseCaps

- Convert to 'cleanup' label naming
- Use more than one 'tmp' string and do all freeing at the end
- Make the code easier to follow
Acked-by: NMichal Privoznik <mprivozn@redhat.com>
Signed-off-by: NCole Robinson <crobinso@redhat.com>
上级 bd884c56
......@@ -19121,43 +19121,45 @@ virDomainDefParseCaps(virDomainDefPtr def,
unsigned int flags)
{
int ret = -1;
int virtType;
char *tmp = NULL;
char *virttype = NULL;
char *arch = NULL;
char *ostype = NULL;
virCapsDomainDataPtr capsdata = NULL;
/* Find out what type of virtualization to use */
if (!(tmp = virXMLPropString(ctxt->node, "type"))) {
virttype = virXPathString("string(./@type)", ctxt);
ostype = virXPathString("string(./os/type[1])", ctxt);
arch = virXPathString("string(./os/type[1]/@arch)", ctxt);
def->os.bootloader = virXPathString("string(./bootloader)", ctxt);
def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt);
def->os.machine = virXPathString("string(./os/type[1]/@machine)", ctxt);
def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
if (!virttype) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("missing domain type attribute"));
goto error;
goto cleanup;
}
if ((virtType = virDomainVirtTypeFromString(tmp)) < 0) {
if ((def->virtType = virDomainVirtTypeFromString(virttype)) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("invalid domain type %s"), tmp);
goto error;
_("invalid domain type %s"), virttype);
goto cleanup;
}
def->virtType = virtType;
VIR_FREE(tmp);
def->os.bootloader = virXPathString("string(./bootloader)", ctxt);
def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt);
tmp = virXPathString("string(./os/type[1])", ctxt);
if (!tmp) {
if (!ostype) {
if (def->os.bootloader) {
def->os.type = VIR_DOMAIN_OSTYPE_XEN;
} else {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("an os <type> must be specified"));
goto error;
goto cleanup;
}
} else {
if ((def->os.type = virDomainOSTypeFromString(tmp)) < 0) {
if ((def->os.type = virDomainOSTypeFromString(ostype)) < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown OS type '%s'"), tmp);
goto error;
_("unknown OS type '%s'"), ostype);
goto cleanup;
}
VIR_FREE(tmp);
}
/*
......@@ -19170,17 +19172,11 @@ virDomainDefParseCaps(virDomainDefPtr def,
def->os.type = VIR_DOMAIN_OSTYPE_XEN;
}
tmp = virXPathString("string(./os/type[1]/@arch)", ctxt);
if (tmp && !(def->os.arch = virArchFromString(tmp))) {
if (arch && !(def->os.arch = virArchFromString(arch))) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unknown architecture %s"),
tmp);
goto error;
_("Unknown architecture %s"), arch);
goto cleanup;
}
VIR_FREE(tmp);
def->os.machine = virXPathString("string(./os/type[1]/@machine)", ctxt);
def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
if ((!def->os.arch || !def->os.machine) &&
!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) {
......@@ -19191,26 +19187,28 @@ virDomainDefParseCaps(virDomainDefPtr def,
* in numerous minor ways. */
bool use_virttype = ((def->os.arch == VIR_ARCH_NONE) ||
!def->os.machine);
virCapsDomainDataPtr capsdata = NULL;
if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
def->os.arch, use_virttype ? def->virtType : VIR_DOMAIN_VIRT_NONE,
if (!(capsdata = virCapabilitiesDomainDataLookup(caps,
def->os.type,
def->os.arch,
use_virttype ? def->virtType : VIR_DOMAIN_VIRT_NONE,
NULL, NULL)))
goto error;
goto cleanup;
if (!def->os.arch)
def->os.arch = capsdata->arch;
if ((!def->os.machine &&
VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0)) {
VIR_FREE(capsdata);
goto error;
goto cleanup;
}
VIR_FREE(capsdata);
}
ret = 0;
error:
VIR_FREE(tmp);
cleanup:
VIR_FREE(virttype);
VIR_FREE(ostype);
VIR_FREE(arch);
VIR_FREE(capsdata);
return ret;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册