diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c index e3b8234b4170ee79fe9cc569fea3d537c7fd378d..eb091070c92b0bffd4a28e45d67b1085000c59f1 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 fa443d3ad77c91cc884a54f68b4f0afc27620971..ae9626feaa53a30c8b1c0e523dc5a2fe9d172a6e 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);