Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
---
 tools/Makefile.am            |  9 ++++++
 tools/virt-admin-completer.c | 76 ++++++++++++++++++++++++++++++++++++++++++++
 tools/virt-admin-completer.h | 33 +++++++++++++++++++
 tools/virt-admin.c           |  8 +++++
 4 files changed, 126 insertions(+)
 create mode 100644 tools/virt-admin-completer.c
 create mode 100644 tools/virt-admin-completer.h

diff --git a/tools/Makefile.am b/tools/Makefile.am
index 8eddc7bbe..a1652d459 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -261,6 +261,15 @@ virt_admin_SOURCES = \
                virt-admin.c virt-admin.h \
                $(NULL)
 
+VIRT_ADMIN_COMPLETER = \
+               virt-admin-completer.c virt-admin-completer.h
+
+if WITH_READLINE
+virt_admin_SOURCES += $(VIRT_ADMIN_COMPLETER)
+else ! WITH_READLINE
+EXTRA_DIST += $(VIRT_ADMIN_COMPLETER)
+endif ! WITH_READLINE
+
 virt_admin_LDFLAGS = \
                $(AM_LDFLAGS) \
                $(COVERAGE_LDFLAGS) \
diff --git a/tools/virt-admin-completer.c b/tools/virt-admin-completer.c
new file mode 100644
index 000000000..2cd471f32
--- /dev/null
+++ b/tools/virt-admin-completer.c
@@ -0,0 +1,76 @@
+/*
+ * virt-admin-completer.c: virt-admin completer callbacks
+ *
+ * Copyright (C) 2017 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *  Michal Privoznik <mpriv...@redhat.com>
+ *
+ */
+
+#include <config.h>
+
+#include "virt-admin-completer.h"
+#include "internal.h"
+#include "virt-admin.h"
+#include "viralloc.h"
+#include "virstring.h"
+
+
+char **
+vshAdmServerCompleter(vshControl *ctl,
+                      const vshCmd *cmd ATTRIBUTE_UNUSED,
+                      unsigned int flags)
+{
+    vshAdmControlPtr priv = ctl->privData;
+    virAdmServerPtr *srvs = NULL;
+    int nsrvs = 0;
+    size_t i = 0;
+    char **ret = NULL;
+
+    virCheckFlags(0, NULL);
+
+    if (!priv->conn || virAdmConnectIsAlive(priv->conn) <= 0)
+        return NULL;
+
+    /* Obtain a list of available servers on the daemon */
+    if ((nsrvs = virAdmConnectListServers(priv->conn, &srvs, 0)) < 0)
+        return NULL;
+
+    if (VIR_ALLOC_N(ret, nsrvs + 1) < 0)
+        goto error;
+
+    for (i = 0; i < nsrvs; i++) {
+        const char *name = virAdmServerGetName(srvs[i]);
+
+        if (VIR_STRDUP(ret[i], name) < 0)
+            goto error;
+
+        virAdmServerFree(srvs[i]);
+    }
+    VIR_FREE(srvs);
+
+    return ret;
+
+ error:
+    for (; i < nsrvs; i++)
+        virAdmServerFree(srvs[i]);
+    VIR_FREE(srvs);
+    for (i = 0; i < nsrvs; i++)
+        VIR_FREE(ret[i]);
+    VIR_FREE(ret);
+    return ret;
+}
diff --git a/tools/virt-admin-completer.h b/tools/virt-admin-completer.h
new file mode 100644
index 000000000..7507b95c1
--- /dev/null
+++ b/tools/virt-admin-completer.h
@@ -0,0 +1,33 @@
+/*
+ * virt-admin-completer.h: virt-admin completer callbacks
+ *
+ * Copyright (C) 2017 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *  Michal Privoznik <mpriv...@redhat.com>
+ *
+ */
+
+#ifndef VIRT_ADMIN_COMPLETER
+# define VIRT_ADMIN_COMPLETER
+
+# include "vsh.h"
+
+char **
+vshAdmServerCompleter(vshControl *ctl,
+                      const vshCmd *cmd,
+                      unsigned int flags);
+#endif
diff --git a/tools/virt-admin.c b/tools/virt-admin.c
index c24ed95c0..41b945e49 100644
--- a/tools/virt-admin.c
+++ b/tools/virt-admin.c
@@ -39,6 +39,7 @@
 #include "virthread.h"
 #include "virgettext.h"
 #include "virtime.h"
+#include "virt-admin-completer.h"
 
 /* Gnulib doesn't guarantee SA_SIGINFO support.  */
 #ifndef SA_SIGINFO
@@ -432,6 +433,7 @@ static const vshCmdOptDef opts_srv_threadpool_info[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("Server to retrieve threadpool attributes from."),
     },
     {.name = NULL}
@@ -493,6 +495,7 @@ static const vshCmdOptDef opts_srv_threadpool_set[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("Server to alter threadpool attributes on."),
     },
     {.name = "min-workers",
@@ -599,6 +602,7 @@ static const vshCmdOptDef opts_srv_clients_list[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("server which to list connected clients from"),
     },
     {.name = NULL}
@@ -680,6 +684,7 @@ static const vshCmdOptDef opts_client_info[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("server to which <client> is connected to"),
     },
     {.name = "client",
@@ -767,6 +772,7 @@ static const vshCmdOptDef opts_client_disconnect[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("server which the client is currently connected to"),
     },
     {.name = "client",
@@ -832,6 +838,7 @@ static const vshCmdOptDef opts_srv_clients_info[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("Server to retrieve the client limits from."),
     },
     {.name = NULL}
@@ -891,6 +898,7 @@ static const vshCmdOptDef opts_srv_clients_set[] = {
     {.name = "server",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
+     .completer = vshAdmServerCompleter,
      .help = N_("Server to alter the client-related configuration limits on."),
     },
     {.name = "max-clients",
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to