[libvirt] [PATCH] tools: virsh: Add virshCellnoCompleter.
Michal Privoznik
mprivozn at redhat.com
Fri May 25 08:36:28 UTC 2018
On 05/25/2018 09:12 AM, Roland Schulz wrote:
> Signed-off-by: Roland Schulz <schullzroll at gmail.com>
> ---
> tools/virsh-completer.c | 59 +++++++++++++++++++++++++++++++++++++++++
> tools/virsh-completer.h | 3 +++
> tools/virsh-host.c | 3 +++
> 3 files changed, 65 insertions(+)
>
> diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c
> index 5713a887e..ce152226f 100644
> --- a/tools/virsh-completer.c
> +++ b/tools/virsh-completer.c
> @@ -756,3 +756,62 @@ virshNodedevEventNameCompleter(vshControl *ctl ATTRIBUTE_UNUSED,
> virStringListFree(ret);
> return NULL;
> }
> +
> +
> +char **
> +virshCellnoCompleter(vshControl *ctl,
> + const vshCmd *cmd ATTRIBUTE_UNUSED,
> + unsigned int flags)
> +{
> + xmlXPathContextPtr ctxt = NULL;
> + virshControlPtr priv = ctl->privData;
> + unsigned int ncells = 0;
> + xmlNodePtr *cells = NULL;
> + xmlDocPtr doc = NULL;
> + size_t i = 0;
> + char *cap_xml = NULL;
> + char *cellid = NULL;
> + char **ret = NULL;
> +
> + virCheckFlags(0, NULL);
> +
> + if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
> + goto error;
> +
> + if (!(cap_xml = virConnectGetCapabilities(priv->conn)))
> + goto error;
> +
> + if (!(doc = virXMLParseStringCtxt(cap_xml, _("capabilities"), &ctxt)))
> + goto error;
> +
> + ncells = virXPathNodeSet("/capabilities/host/topology/cells/cell", ctxt, &cells);
> + if (ncells <= 0)
> + goto error;
> +
> + if (VIR_ALLOC_N(ret, ncells + 1))
> + goto error;
> +
> + for (i = 0; i < ncells; i++) {
> + VIR_FREE(cellid);
> + cellid = virXMLPropString(cells[i], "id");
> + if (VIR_STRDUP(ret[i], cellid) < 0)
The virXMLPropString() already returns a dynamically allocated string
(that's why you call VIR_FREE(cellid)). There's not much value added in
duplicating the string again. What you can do is assign the returned
value to ret[i] directly:
for (i = 0; i < ncells; i++) {
if (!(ret[i] = virXMLPropString(cells[i], "id")))
goto error;
}
This way @cellid variable is needless.
> + goto error;
> + }
> +
> + cleanup:
> + xmlXPathFreeContext(ctxt);
> + VIR_FREE(cells);
> + xmlFreeDoc(doc);
> + VIR_FREE(cap_xml);
> + VIR_FREE(cellid);
> +
> + return ret;
> +
> + error:
> + if (ret) {
> + for (i = 0; i < ncells; i++)
> + VIR_FREE(ret[i]);
> + }
> + VIR_FREE(ret);
> + goto cleanup;
> +}
I'm fixing that, ACKing and pushing.
Michal
More information about the libvir-list
mailing list