[libvirt] [v4 3/5] virsh: Add vshDomainCompleter

Tomas Meszaros exo at tty.sk
Tue Sep 10 15:54:28 UTC 2013


Function vshDomainCompler returns domains names which can be used
by various virsh commands, for example:

 virsh # start --domain <TAB>
  fedora      domain_foo    domain_bar

---
v2
* global variable __my_conn renamed to vshConn
* @name is now const char *
* label cleanup renamed to error

v3
* removed useless if
* used virStringFreeList() instead of iteration
* added vshControl *vshCtl instead of virConnectPtr *vshConn because
  vshCtl is needed in order to call vshReconnect()
* moved all .completer = vshDomainCompleter initializations from
  other patches into this

v4
* vshControl *vshCtl marked static
* changed vshMalloc to VIR_ALLOC_N
* fixed link error if building without USE_READLINE
* fixed @domains[] mem leak
* vshDomainCompleter .completer and .completer_flags initializers are
  now only in cmdOptDef
* reconnecting now takes place in the vshReadlineOptionsGenerator()
  and only just before auto-completion happens

 tools/virsh-domain-monitor.c |  52 ++++++--
 tools/virsh-domain.c         | 301 +++++++++++++++++++++++++++++++++----------
 tools/virsh-snapshot.c       |  50 +++++--
 tools/virsh.c                |  55 ++++++++
 tools/virsh.h                |   2 +
 5 files changed, 373 insertions(+), 87 deletions(-)

diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index b29b82a..f00cdfa 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -310,7 +310,9 @@ static const vshCmdOptDef opts_dommemstat[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "period",
      .type = VSH_OT_DATA,
@@ -434,7 +436,10 @@ static const vshCmdOptDef opts_domblkinfo[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "device",
      .type = VSH_OT_DATA,
@@ -489,7 +494,10 @@ static const vshCmdOptDef opts_domblklist[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "inactive",
      .type = VSH_OT_BOOL,
@@ -603,7 +611,10 @@ static const vshCmdOptDef opts_domiflist[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "inactive",
      .type = VSH_OT_BOOL,
@@ -708,7 +719,10 @@ static const vshCmdOptDef opts_domif_getlink[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "interface",
      .type = VSH_OT_DATA,
@@ -823,7 +837,9 @@ static const vshCmdOptDef opts_domcontrol[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -876,7 +892,10 @@ static const vshCmdOptDef opts_domblkstat[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_RUNNING
     },
     {.name = "device",
      .type = VSH_OT_DATA,
@@ -1059,7 +1078,10 @@ static const vshCmdOptDef opts_domifstat[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_RUNNING
     },
     {.name = "interface",
      .type = VSH_OT_DATA,
@@ -1136,7 +1158,9 @@ static const vshCmdOptDef opts_domblkerror[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id, or uuid")
+     .help = N_("domain name, id, or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -1201,7 +1225,10 @@ static const vshCmdOptDef opts_dominfo[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -1343,7 +1370,10 @@ static const vshCmdOptDef opts_domstate[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "reason",
      .type = VSH_OT_BOOL,
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 74feca1..7747446 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -165,7 +165,8 @@ static const vshCmdOptDef opts_attach_device[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "file",
      .type = VSH_OT_DATA,
@@ -267,7 +268,9 @@ static const vshCmdOptDef opts_attach_disk[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "source",
      .type = VSH_OT_DATA,
@@ -708,7 +711,9 @@ static const vshCmdOptDef opts_attach_interface[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "type",
      .type = VSH_OT_DATA,
@@ -962,7 +967,10 @@ static const vshCmdOptDef opts_autostart[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "disable",
      .type = VSH_OT_BOOL,
@@ -1018,7 +1026,10 @@ static const vshCmdOptDef opts_blkdeviotune[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "device",
      .type = VSH_OT_DATA,
@@ -1242,7 +1253,10 @@ static const vshCmdOptDef opts_blkiotune[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "weight",
      .type = VSH_OT_INT,
@@ -1505,7 +1519,10 @@ static const vshCmdOptDef opts_block_commit[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "path",
      .type = VSH_OT_DATA,
@@ -1680,7 +1697,10 @@ static const vshCmdOptDef opts_block_copy[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "path",
      .type = VSH_OT_DATA,
@@ -1886,7 +1906,9 @@ static const vshCmdOptDef opts_block_job[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "path",
      .type = VSH_OT_DATA,
@@ -1984,7 +2006,9 @@ static const vshCmdOptDef opts_block_pull[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "path",
      .type = VSH_OT_DATA,
@@ -2150,7 +2174,9 @@ static const vshCmdOptDef opts_block_resize[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "path",
      .type = VSH_OT_DATA,
@@ -2220,7 +2246,10 @@ static const vshCmdOptDef opts_console[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "devname",
      .type = VSH_OT_STRING,
@@ -2317,7 +2346,10 @@ static const vshCmdOptDef opts_domif_setlink[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "interface",
      .type = VSH_OT_DATA,
@@ -2511,7 +2543,10 @@ static const vshCmdOptDef opts_domiftune[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "interface",
      .type = VSH_OT_DATA,
@@ -2698,7 +2733,9 @@ static const vshCmdOptDef opts_suspend[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -2744,7 +2781,10 @@ static const vshCmdOptDef opts_dom_pm_suspend[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_RUNNING
     },
     {.name = "duration",
      .type = VSH_OT_INT,
@@ -2828,7 +2868,9 @@ static const vshCmdOptDef opts_dom_pm_wakeup[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -2877,7 +2919,10 @@ static const vshCmdOptDef opts_undefine[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name or uuid")
+     .help = N_("domain name or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "managed-save",
      .type = VSH_OT_BOOL,
@@ -3238,7 +3283,10 @@ static const vshCmdOptDef opts_start[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("name of the inactive domain")
+     .help = N_("name of the inactive domain"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_INACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_PERSISTENT
     },
 #ifndef WIN32
     {.name = "console",
@@ -3422,7 +3470,9 @@ static const vshCmdOptDef opts_save[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "file",
      .type = VSH_OT_DATA,
@@ -3886,7 +3936,11 @@ static const vshCmdOptDef opts_managedsave[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_RUNNING |
+                        VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE
     },
     {.name = "running",
      .type = VSH_OT_BOOL,
@@ -4006,7 +4060,10 @@ static const vshCmdOptDef opts_managedsaveremove[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_INACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE
     },
     {.name = NULL}
 };
@@ -4065,7 +4122,10 @@ static const vshCmdOptDef opts_schedinfo[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "weight",
      .type = VSH_OT_INT,
@@ -4408,7 +4468,9 @@ static const vshCmdOptDef opts_dump[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "file",
      .type = VSH_OT_DATA,
@@ -4538,7 +4600,8 @@ static const vshCmdOptDef opts_screenshot[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "file",
      .type = VSH_OT_DATA,
@@ -4685,7 +4748,10 @@ static const vshCmdOptDef opts_resume[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_PAUSED
     },
     {.name = NULL}
 };
@@ -4728,7 +4794,9 @@ static const vshCmdOptDef opts_shutdown[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "mode",
      .type = VSH_OT_STRING,
@@ -4814,7 +4882,9 @@ static const vshCmdOptDef opts_reboot[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "mode",
      .type = VSH_OT_STRING,
@@ -4895,7 +4965,9 @@ static const vshCmdOptDef opts_reset[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -4938,7 +5010,9 @@ static const vshCmdOptDef opts_domjobinfo[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -5150,7 +5224,9 @@ static const vshCmdOptDef opts_domjobabort[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -5226,7 +5302,10 @@ static const vshCmdOptDef opts_vcpucount[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "maximum",
      .type = VSH_OT_BOOL,
@@ -5436,7 +5515,10 @@ static const vshCmdOptDef opts_vcpuinfo[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -5545,7 +5627,10 @@ static const vshCmdOptDef opts_vcpupin[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "vcpu",
      .type = VSH_OT_INT,
@@ -5832,7 +5917,10 @@ static const vshCmdOptDef opts_emulatorpin[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "cpulist",
      .type = VSH_OT_DATA,
@@ -5951,7 +6039,9 @@ static const vshCmdOptDef opts_setvcpus[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "count",
      .type = VSH_OT_INT,
@@ -6289,7 +6379,9 @@ static const vshCmdOptDef opts_cpu_stats[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "total",
      .type = VSH_OT_BOOL,
@@ -6620,7 +6712,9 @@ static const vshCmdOptDef opts_destroy[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "graceful",
      .type = VSH_OT_BOOL,
@@ -6677,7 +6771,10 @@ static const vshCmdOptDef opts_desc[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "live",
      .type = VSH_OT_BOOL,
@@ -6851,7 +6948,9 @@ static const vshCmdOptDef opts_inject_nmi[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -6889,7 +6988,9 @@ static const vshCmdOptDef opts_send_key[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "codeset",
      .type = VSH_OT_STRING,
@@ -6991,7 +7092,9 @@ static const vshCmdOptDef opts_send_process_signal[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "pid",
      .type = VSH_OT_DATA,
@@ -7106,7 +7209,9 @@ static const vshCmdOptDef opts_setmem[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "kilobytes",
      .type = VSH_OT_ALIAS,
@@ -7203,7 +7308,9 @@ static const vshCmdOptDef opts_setmaxmem[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "kilobytes",
      .type = VSH_OT_ALIAS,
@@ -7305,7 +7412,10 @@ static const vshCmdOptDef opts_memtune[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "hard-limit",
      .type = VSH_OT_INT,
@@ -7504,7 +7614,10 @@ static const vshCmdOptDef opts_numatune[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "mode",
      .type = VSH_OT_DATA,
@@ -7651,7 +7764,10 @@ static const vshCmdOptDef opts_qemu_monitor_command[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "hmp",
      .type = VSH_OT_BOOL,
@@ -7801,7 +7917,10 @@ static const vshCmdOptDef opts_qemu_agent_command[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "timeout",
      .type = VSH_OT_INT,
@@ -7930,7 +8049,10 @@ static const vshCmdOptDef opts_lxc_enter_namespace[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "noseclabel",
      .type = VSH_OT_BOOL,
@@ -8068,7 +8190,10 @@ static const vshCmdOptDef opts_dumpxml[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "inactive",
      .type = VSH_OT_BOOL,
@@ -8290,7 +8415,10 @@ static const vshCmdOptDef opts_domid[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name or uuid")
+     .help = N_("domain name or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -8331,7 +8459,10 @@ static const vshCmdOptDef opts_domuuid[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain id or name")
+     .help = N_("domain id or name"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -8703,7 +8834,10 @@ static const vshCmdOptDef opts_migrate_setmaxdowntime[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "downtime",
      .type = VSH_OT_INT,
@@ -8757,7 +8891,9 @@ static const vshCmdOptDef opts_migrate_compcache[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "size",
      .type = VSH_OT_INT,
@@ -8819,7 +8955,10 @@ static const vshCmdOptDef opts_migrate_setspeed[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "bandwidth",
      .type = VSH_OT_INT,
@@ -8871,7 +9010,10 @@ static const vshCmdOptDef opts_migrate_getspeed[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -8915,7 +9057,10 @@ static const vshCmdOptDef opts_domdisplay[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "include-password",
      .type = VSH_OT_BOOL,
@@ -9093,7 +9238,9 @@ static const vshCmdOptDef opts_vncdisplay[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -9166,7 +9313,9 @@ static const vshCmdOptDef opts_ttyconsole[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = NULL}
 };
@@ -9226,7 +9375,10 @@ static const vshCmdOptDef opts_domhostname[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -9389,7 +9541,9 @@ static const vshCmdOptDef opts_detach_device[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE
     },
     {.name = "file",
      .type = VSH_OT_DATA,
@@ -9490,7 +9644,10 @@ static const vshCmdOptDef opts_update_device[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "file",
      .type = VSH_OT_DATA,
@@ -9592,7 +9749,10 @@ static const vshCmdOptDef opts_detach_interface[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "type",
      .type = VSH_OT_DATA,
@@ -9993,7 +10153,10 @@ static const vshCmdOptDef opts_detach_disk[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "target",
      .type = VSH_OT_DATA,
@@ -10103,7 +10266,10 @@ static const vshCmdOptDef opts_edit[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = NULL}
 };
@@ -10163,7 +10329,10 @@ static const vshCmdOptDef opts_change_media[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "path",
      .type = VSH_OT_DATA,
diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c
index e37a5b3..3f13c7b 100644
--- a/tools/virsh-snapshot.c
+++ b/tools/virsh-snapshot.c
@@ -125,7 +125,10 @@ static const vshCmdOptDef opts_snapshot_create[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "xmlfile",
      .type = VSH_OT_DATA,
@@ -328,7 +331,10 @@ static const vshCmdOptDef opts_snapshot_create_as[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "name",
      .type = VSH_OT_DATA,
@@ -520,7 +526,10 @@ static const vshCmdOptDef opts_snapshot_edit[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "snapshotname",
      .type = VSH_OT_DATA,
@@ -642,7 +651,10 @@ static const vshCmdOptDef opts_snapshot_current[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "name",
      .type = VSH_OT_BOOL,
@@ -878,7 +890,10 @@ static const vshCmdOptDef opts_snapshot_info[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "snapshotname",
      .type = VSH_OT_DATA,
@@ -1435,7 +1450,10 @@ static const vshCmdOptDef opts_snapshot_list[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "parent",
      .type = VSH_OT_BOOL,
@@ -1699,7 +1717,10 @@ static const vshCmdOptDef opts_snapshot_dumpxml[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "snapshotname",
      .type = VSH_OT_DATA,
@@ -1767,7 +1788,10 @@ static const vshCmdOptDef opts_snapshot_parent[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "snapshotname",
      .type = VSH_OT_DATA,
@@ -1835,7 +1859,10 @@ static const vshCmdOptDef opts_snapshot_revert[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "snapshotname",
      .type = VSH_OT_DATA,
@@ -1928,7 +1955,10 @@ static const vshCmdOptDef opts_snapshot_delete[] = {
     {.name = "domain",
      .type = VSH_OT_DATA,
      .flags = VSH_OFLAG_REQ,
-     .help = N_("domain name, id or uuid")
+     .help = N_("domain name, id or uuid"),
+     .completer = vshDomainCompleter,
+     .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
+                        VIR_CONNECT_LIST_DOMAINS_INACTIVE
     },
     {.name = "snapshotname",
      .type = VSH_OT_DATA,
diff --git a/tools/virsh.c b/tools/virsh.c
index 321ed5d..271c841 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -89,6 +89,8 @@ static char *progname;
 
 static const vshCmdGrp cmdGroups[];
 
+static vshControl *vshCtl;
+
 /* Bypass header poison */
 #undef strdup
 
@@ -2580,6 +2582,54 @@ vshCloseLogFile(vshControl *ctl)
     }
 }
 
+/* -------------
+ * Completers
+ * -------------
+ */
+
+char **
+vshDomainCompleter(unsigned int completer_flags ATTRIBUTE_UNUSED)
+{
+#ifdef USE_READLINE
+    virDomainPtr *domains;
+    size_t i;
+    char **names = NULL;
+    int ndomains;
+
+    if (!vshCtl->conn)
+        return NULL;
+
+    ndomains = virConnectListAllDomains(vshCtl->conn, &domains, completer_flags);
+
+    if (ndomains < 0)
+        return NULL;
+
+    if (VIR_ALLOC_N(names, ndomains + 1) < 0)
+        return NULL;
+
+    for (i = 0; i < ndomains; i++) {
+        const char *name = virDomainGetName(domains[i]);
+        if (VIR_STRDUP(names[i], name) < 0) {
+            virDomainFree(domains[i]);
+            goto error;
+        }
+        virDomainFree(domains[i]);
+    }
+    names[i] = NULL;
+    VIR_FREE(domains);
+    return names;
+
+error:
+    virStringFreeList(names);
+    for (i = i+1; i < ndomains; i++)
+        virDomainFree(domains[i]);
+    VIR_FREE(domains);
+    return NULL;
+#else
+    return NULL;
+#endif
+}
+
 #ifdef USE_READLINE
 
 /* -----------------
@@ -2769,6 +2819,10 @@ vshReadlineOptionsGenerator(const char *text, int state)
     if (!cmd)
         return NULL;
 
+    if ((vshCtl->conn == NULL || disconnected) &&
+        !(cmd->flags & VSH_CMD_FLAG_NOCONNECT))
+        vshReconnect(vshCtl);
+
     if (!cmd->opts)
         return NULL;
 
@@ -3460,6 +3514,7 @@ main(int argc, char **argv)
     ctl->debug = VSH_DEBUG_DEFAULT;
     ctl->escapeChar = "^]";     /* Same default as telnet */
 
+    vshCtl = ctl;
 
     if (!setlocale(LC_ALL, "")) {
         perror("setlocale");
diff --git a/tools/virsh.h b/tools/virsh.h
index f978d94..845fc17 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -258,6 +258,8 @@ struct _vshCmdGrp {
     const vshCmdDef *commands;
 };
 
+char **vshDomainCompleter(unsigned int flags);
+
 void vshError(vshControl *ctl, const char *format, ...)
     ATTRIBUTE_FMT_PRINTF(2, 3);
 void vshOpenLogFile(vshControl *ctl);
-- 
1.8.3.1




More information about the libvir-list mailing list