Signed-off-by: Michal Privoznik <mprivozn(a)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 <mprivozn(a)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 <mprivozn(a)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