]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virsh: Add serial/parallel device name completion to console command
authorLin Ma <lma@suse.com>
Tue, 10 Nov 2020 09:50:54 +0000 (17:50 +0800)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 10 Nov 2020 17:34:04 +0000 (18:34 +0100)
Signed-off-by: Lin Ma <lma@suse.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
tools/virsh-completer-domain.c
tools/virsh-completer-domain.h
tools/virsh-domain.c

index 3521d6cbe35320632b0fa3c472cb302cdb1d23ed..4612a9e51d35cd08561fcbec3fc414c33d93eaf8 100644 (file)
@@ -661,3 +661,57 @@ virshDomainVcpulistViaAgentCompleter(vshControl *ctl,
     virshDomainFree(dom);
     return ret;
 }
+
+
+char **
+virshDomainConsoleCompleter(vshControl *ctl,
+                            const vshCmd *cmd,
+                            unsigned int flags)
+{
+    virshControlPtr priv = ctl->privData;
+    g_autoptr(xmlDoc) xmldoc = NULL;
+    g_autoptr(xmlXPathContext) ctxt = NULL;
+    int nserials;
+    int nparallels;
+    g_autofree xmlNodePtr *serials = NULL;
+    g_autofree xmlNodePtr *parallels = NULL;
+    size_t i;
+    size_t offset = 0;
+    VIR_AUTOSTRINGLIST tmp = NULL;
+
+    virCheckFlags(0, NULL);
+
+    if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
+        return NULL;
+
+    if (virshDomainGetXML(ctl, cmd, 0, &xmldoc, &ctxt) < 0)
+        return NULL;
+
+    nserials = virXPathNodeSet("./devices/serial", ctxt, &serials);
+    if (nserials < 0)
+        return NULL;
+
+    nparallels = virXPathNodeSet("./devices/parallel", ctxt, &parallels);
+    if (nparallels < 0)
+        return NULL;
+
+    tmp = g_new0(char *, nserials + nparallels + 1);
+
+    for (i = 0; i < nserials + nparallels; i++) {
+        g_autofree char *type = NULL;
+
+
+        if (i < nserials)
+            ctxt->node = serials[i];
+        else
+            ctxt->node = parallels[i - nserials];
+
+        type = virXPathString("string(./@type)", ctxt);
+        if (STRNEQ(type, "pty"))
+            continue;
+
+        tmp[offset++] = virXPathString("string(./alias/@name)", ctxt);
+    }
+
+    return g_steal_pointer(&tmp);
+}
index d5021f6aa6a834a1e0f4a5740f7363386762782a..02fea2fe94b55d230e42dea4386752c653fb1691 100644 (file)
@@ -94,3 +94,7 @@ char ** virshDomainCpulistCompleter(vshControl *ctl,
 char ** virshDomainVcpulistViaAgentCompleter(vshControl *ctl,
                                              const vshCmd *cmd,
                                              unsigned int flags);
+
+char ** virshDomainConsoleCompleter(vshControl *ctl,
+                                    const vshCmd *cmd,
+                                    unsigned int flags);
index 675d96440db734c6810af7f25479a1722d6e68df..022dbdca3c1064fb17c4b8acbe5ea28ca30561b2 100644 (file)
@@ -2960,6 +2960,7 @@ static const vshCmdOptDef opts_console[] = {
     VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE),
     {.name = "devname", /* sc_prohibit_devname */
      .type = VSH_OT_STRING,
+     .completer = virshDomainConsoleCompleter,
      .help = N_("character device name")
     },
     {.name = "force",