From 14dd3b63e947497b1d9d796ccf0577a4a16510b1 Mon Sep 17 00:00:00 2001 From: Lin Ma Date: Tue, 15 May 2018 19:18:23 +0800 Subject: [PATCH] virsh: Introduce virshDomainDiskTargetCompleter Signed-off-by: Lin Ma Signed-off-by: Michal Privoznik --- tools/virsh-completer.c | 48 +++++++++++++++++++++++++++++++++++++++++ tools/virsh-completer.h | 4 ++++ 2 files changed, 52 insertions(+) diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c index e3b8234b41..eb091070c9 100644 --- a/tools/virsh-completer.c +++ b/tools/virsh-completer.c @@ -143,6 +143,54 @@ virshDomainInterfaceCompleter(vshControl *ctl, } +char ** +virshDomainDiskTargetCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags) +{ + virshControlPtr priv = ctl->privData; + xmlDocPtr xmldoc = NULL; + xmlXPathContextPtr ctxt = NULL; + xmlNodePtr *disks = NULL; + int ndisks; + size_t i; + char **ret = NULL; + + virCheckFlags(0, NULL); + + if (!priv->conn || virConnectIsAlive(priv->conn) <= 0) + return NULL; + + if (virshDomainGetXML(ctl, cmd, 0, &xmldoc, &ctxt) < 0) + goto error; + + ndisks = virXPathNodeSet("./devices/disk", ctxt, &disks); + if (ndisks < 0) + goto error; + + if (VIR_ALLOC_N(ret, ndisks + 1) < 0) + goto error; + + for (i = 0; i < ndisks; i++) { + ctxt->node = disks[i]; + if (!(ret[i] = virXPathString("string(./target/@dev)", ctxt))) + goto error; + } + + VIR_FREE(disks); + xmlFreeDoc(xmldoc); + xmlXPathFreeContext(ctxt); + return ret; + + error: + VIR_FREE(disks); + xmlFreeDoc(xmldoc); + xmlXPathFreeContext(ctxt); + virStringListFree(ret); + return NULL; +} + + char ** virshStoragePoolNameCompleter(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED, diff --git a/tools/virsh-completer.h b/tools/virsh-completer.h index fa443d3ad7..ae9626feaa 100644 --- a/tools/virsh-completer.h +++ b/tools/virsh-completer.h @@ -38,6 +38,10 @@ char ** virshDomainInterfaceCompleter(vshControl *ctl, const vshCmd *cmd, unsigned int flags); +char ** virshDomainDiskTargetCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags); + char ** virshStoragePoolNameCompleter(vshControl *ctl, const vshCmd *cmd, unsigned int flags);