---
tools/virsh-domain.c | 88 +++++++++++++++++++++-------------------------------
1 file changed, 35 insertions(+), 53 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index ff620b6..bcb855f 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -6313,8 +6313,9 @@ cmdNumatune(vshControl * ctl, const vshCmd * cmd)
{
virDomainPtr dom;
int nparams = 0;
+ int maxparams = 0;
unsigned int i = 0;
- virTypedParameterPtr params = NULL, temp = NULL;
+ virTypedParameterPtr params = NULL;
const char *nodeset = NULL;
bool ret = false;
unsigned int flags = 0;
@@ -6341,18 +6342,32 @@ cmdNumatune(vshControl * ctl, const vshCmd * cmd)
if (vshCommandOptString(cmd, "nodeset", &nodeset) < 0) {
vshError(ctl, "%s", _("Unable to parse nodeset."));
- virDomainFree(dom);
- return false;
+ goto cleanup;
}
- if (nodeset)
- nparams++;
+ if (nodeset &&
+ virTypedParamsAddString(¶ms, &nparams, &maxparams,
+ VIR_DOMAIN_NUMA_NODESET, nodeset) < 0)
+ goto save_error;
+
if (vshCommandOptString(cmd, "mode", &mode) < 0) {
vshError(ctl, "%s", _("Unable to parse mode."));
- virDomainFree(dom);
- return false;
+ goto cleanup;
+ }
+ if (mode) {
+ int m;
+ /* Accept string or integer, in case server understands newer
+ * integer than what strings we were compiled with
+ */
+ if ((m = virDomainNumatuneMemModeTypeFromString(mode)) < 0 &&
+ virStrToLong_i(mode, NULL, 0, &m) < 0) {
+ vshError(ctl, _("Invalid mode: %s"), mode);
+ goto cleanup;
+ }
+
+ if (virTypedParamsAddInt(¶ms, &nparams, &maxparams,
+ VIR_DOMAIN_NUMA_MODE, m) < 0)
+ goto save_error;
}
- if (mode)
- nparams++;
if (nparams == 0) {
/* get the number of numa parameters */
@@ -6386,56 +6401,23 @@ cmdNumatune(vshControl * ctl, const vshCmd * cmd)
VIR_FREE(str);
}
}
-
- ret = true;
} else {
- /* set the numa parameters */
- params = vshCalloc(ctl, nparams, sizeof(*params));
-
- for (i = 0; i < nparams; i++) {
- temp = ¶ms[i];
-
- /*
- * Some magic here, this is used to fill the params structure with
- * the valid arguments passed, after filling the particular
- * argument we purposely make them 0, so on the next pass it goes
- * to the next valid argument and so on.
- */
- if (mode) {
- /* Accept string or integer, in case server
- * understands newer integer than what strings we were
- * compiled with */
- if ((temp->value.i =
- virDomainNumatuneMemModeTypeFromString(mode)) < 0 &&
- virStrToLong_i(mode, NULL, 0, &temp->value.i) < 0) {
- vshError(ctl, _("Invalid mode: %s"), mode);
- goto cleanup;
- }
- if (!virStrcpy(temp->field, VIR_DOMAIN_NUMA_MODE,
- sizeof(temp->field)))
- goto cleanup;
- temp->type = VIR_TYPED_PARAM_INT;
- mode = NULL;
- } else if (nodeset) {
- temp->value.s = vshStrdup(ctl, nodeset);
- temp->type = VIR_TYPED_PARAM_STRING;
- if (!virStrcpy(temp->field, VIR_DOMAIN_NUMA_NODESET,
- sizeof(temp->field)))
- goto cleanup;
- nodeset = NULL;
- }
- }
if (virDomainSetNumaParameters(dom, params, nparams, flags) != 0)
- vshError(ctl, "%s", _("Unable to change numa
parameters"));
- else
- ret = true;
+ goto error;
}
- cleanup:
- virTypedParameterArrayClear(params, nparams);
- VIR_FREE(params);
+ ret = true;
+
+cleanup:
+ virTypedParamsFree(params, nparams);
virDomainFree(dom);
return ret;
+
+save_error:
+ vshSaveLibvirtError();
+error:
+ vshError(ctl, "%s", _("Unable to change numa parameters"));
+ goto cleanup;
}
/*
--
1.8.1.1