Signed-off-by: Matt Coleman <matt(a)datto.com>
---
src/hyperv/hyperv_wmi.c | 68 ++++++++++++++++-------------------------
1 file changed, 27 insertions(+), 41 deletions(-)
diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c
index 0a9d4bf4fd..459d207ee7 100644
--- a/src/hyperv/hyperv_wmi.c
+++ b/src/hyperv/hyperv_wmi.c
@@ -744,35 +744,36 @@ hypervInvokeMethod(hypervPrivate *priv,
WsXmlDocH *res)
{
g_autoptr(hypervInvokeParamsList) params = *paramsPtr;
- int result = -1;
size_t i = 0;
int returnCode;
- WsXmlDocH paramsDocRoot = NULL;
- client_opt_t *options = NULL;
- WsXmlDocH response = NULL;
+ g_auto(WsXmlDocH) paramsDocRoot = NULL;
+ g_autoptr(client_opt_t) options = NULL;
+ g_auto(WsXmlDocH) response = NULL;
WsXmlNodeH methodNode = NULL;
- char *returnValue_xpath = NULL;
- char *jobcode_instance_xpath = NULL;
- char *returnValue = NULL;
- char *instanceID = NULL;
+ g_autofree char *returnValue_xpath = NULL;
+ g_autofree char *jobcode_instance_xpath = NULL;
+ g_autofree char *returnValue = NULL;
+ g_autofree char *instanceID = NULL;
bool completed = false;
g_auto(virBuffer) query = VIR_BUFFER_INITIALIZER;
- Msvm_ConcreteJob *job = NULL;
+ g_autoptr(Msvm_ConcreteJob) job = NULL;
int jobState = -1;
hypervParamPtr p = NULL;
int timeout = HYPERV_JOB_TIMEOUT_MS;
+ *paramsPtr = NULL;
+
if (hypervCreateInvokeXmlDoc(params, ¶msDocRoot) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not create XML document"));
- goto cleanup;
+ return -1;
}
methodNode = xml_parser_get_root(paramsDocRoot);
if (!methodNode) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not get root of XML document"));
- goto cleanup;
+ return -1;
}
/* Serialize parameters */
@@ -783,22 +784,22 @@ hypervInvokeMethod(hypervPrivate *priv,
case HYPERV_SIMPLE_PARAM:
if (hypervSerializeSimpleParam(p, params->resourceUri,
&methodNode) < 0)
- goto cleanup;
+ return -1;
break;
case HYPERV_EPR_PARAM:
if (hypervSerializeEprParam(p, priv, params->resourceUri,
&methodNode) < 0)
- goto cleanup;
+ return -1;
break;
case HYPERV_EMBEDDED_PARAM:
if (hypervSerializeEmbeddedParam(p, params->resourceUri,
&methodNode) < 0)
- goto cleanup;
+ return -1;
break;
default:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unknown parameter type"));
- goto cleanup;
+ return -1;
}
}
@@ -807,7 +808,7 @@ hypervInvokeMethod(hypervPrivate *priv,
options = wsmc_options_init();
if (!options) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not init
options"));
- goto cleanup;
+ return -1;
}
wsmc_add_selectors_from_str(options, params->selector);
@@ -824,11 +825,11 @@ hypervInvokeMethod(hypervPrivate *priv,
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get return value for %s invocation"),
params->method);
- goto cleanup;
+ return -1;
}
if (virStrToLong_i(returnValue, NULL, 10, &returnCode) < 0)
- goto cleanup;
+ return -1;
if (returnCode == CIM_RETURNCODE_TRANSITION_STARTED) {
jobcode_instance_xpath =
g_strdup_printf("/s:Envelope/s:Body/p:%s_OUTPUT/p:Job/a:ReferenceParameters/"
@@ -840,7 +841,7 @@ hypervInvokeMethod(hypervPrivate *priv,
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get instance ID for %s invocation"),
params->method);
- goto cleanup;
+ return -1;
}
/*
@@ -862,7 +863,7 @@ hypervInvokeMethod(hypervPrivate *priv,
"WHERE InstanceID = '%s'", instanceID);
if (hypervGetWmiClass(Msvm_ConcreteJob, &job) < 0 || !job)
- goto cleanup;
+ return -1;
jobState = job->data->JobState;
switch (jobState) {
@@ -882,44 +883,29 @@ hypervInvokeMethod(hypervPrivate *priv,
case MSVM_CONCRETEJOB_JOBSTATE_KILLED:
case MSVM_CONCRETEJOB_JOBSTATE_EXCEPTION:
case MSVM_CONCRETEJOB_JOBSTATE_SERVICE:
- goto cleanup;
+ return -1;
default:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unknown invocation state"));
- goto cleanup;
+ return -1;
}
}
if (!completed && timeout < 0) {
virReportError(VIR_ERR_OPERATION_TIMEOUT,
_("Timeout waiting for %s invocation"),
params->method);
- goto cleanup;
+ return -1;
}
} else if (returnCode != CIM_RETURNCODE_COMPLETED_WITH_NO_ERROR) {
virReportError(VIR_ERR_INTERNAL_ERROR, _("Invocation of %s returned an
error: %s (%d)"),
params->method, hypervReturnCodeToString(returnCode),
returnCode);
- goto cleanup;
+ return -1;
}
if (res)
- *res = response;
+ *res = g_steal_pointer(&response);
- result = 0;
-
- cleanup:
- if (options)
- wsmc_options_destroy(options);
- if (response && (!res))
- ws_xml_destroy_doc(response);
- if (paramsDocRoot)
- ws_xml_destroy_doc(paramsDocRoot);
- VIR_FREE(returnValue_xpath);
- VIR_FREE(jobcode_instance_xpath);
- VIR_FREE(returnValue);
- VIR_FREE(instanceID);
- hypervFreeObject((hypervObject *)job);
- *paramsPtr = NULL;
- return result;
+ return 0;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
--
2.30.0