]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virsh: Provide completer for detach-device-alias
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 26 Jun 2018 10:41:34 +0000 (12:41 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 3 Jul 2018 02:56:29 +0000 (04:56 +0200)
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
tools/virsh-completer.c
tools/virsh-completer.h
tools/virsh-domain.c

index 0dc6ae82e18d5f9b41b25cb995325a76fbb0eb48..2327e08340ae530cdd91afb41a174c2b02c6fa79 100644 (file)
@@ -856,3 +856,51 @@ virshCellnoCompleter(vshControl *ctl,
     VIR_FREE(ret);
     goto cleanup;
 }
+
+
+char **
+virshDomainDeviceAliasCompleter(vshControl *ctl,
+                                const vshCmd *cmd,
+                                unsigned int flags)
+{
+    virshControlPtr priv = ctl->privData;
+    xmlDocPtr xmldoc = NULL;
+    xmlXPathContextPtr ctxt = NULL;
+    int naliases;
+    xmlNodePtr *aliases = NULL;
+    size_t i;
+    unsigned int domainXMLFlags = 0;
+    char **ret = NULL;
+    char **tmp = NULL;
+
+    virCheckFlags(0, NULL);
+
+    if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
+        return NULL;
+
+    if (vshCommandOptBool(cmd, "config"))
+        domainXMLFlags = VIR_DOMAIN_XML_INACTIVE;
+
+    if (virshDomainGetXML(ctl, cmd, domainXMLFlags, &xmldoc, &ctxt) < 0)
+        goto cleanup;
+
+    naliases = virXPathNodeSet("./devices//alias/@name", ctxt, &aliases);
+    if (naliases < 0)
+        goto cleanup;
+
+    if (VIR_ALLOC_N(tmp, naliases + 1) < 0)
+        goto cleanup;
+
+    for (i = 0; i < naliases; i++) {
+        if (!(tmp[i] = virXMLNodeContentString(aliases[i])))
+            goto cleanup;
+    }
+
+    VIR_STEAL_PTR(ret, tmp);
+ cleanup:
+    VIR_FREE(aliases);
+    xmlFreeDoc(xmldoc);
+    xmlXPathFreeContext(ctxt);
+    virStringListFree(tmp);
+    return ret;
+}
index fcff040135f33df44c26a9a81f43e7362c9c8b23..1c14bb2a5430a6e261e0877b27d42565699fb63e 100644 (file)
@@ -98,6 +98,10 @@ char ** virshNodedevEventNameCompleter(vshControl *ctl,
                                        const vshCmd *cmd,
                                        unsigned int flags);
 
+char ** virshDomainDeviceAliasCompleter(vshControl *ctl,
+                                        const vshCmd *cmd,
+                                        unsigned int flags);
+
 char ** virshCellnoCompleter(vshControl *ctl,
                              const vshCmd *cmd,
                              unsigned int flags);
index 6aa79f11b9818c3c72d6d43377d441613261dd57..e9b88f00134559c459d78b174e6f7d607476ee30 100644 (file)
@@ -11684,6 +11684,7 @@ static const vshCmdOptDef opts_detach_device_alias[] = {
     {.name = "alias",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = virshDomainDeviceAliasCompleter,
      .help = N_("device alias")
     },
     VIRSH_COMMON_OPT_DOMAIN_CONFIG,