This patch introduces a custom completer for domains, and sets it to be used for all of the "domain" arguments. In order to facilitate this, the functions involved in retrieve in a list of domains were moved from virsh-domain-monitor to virsh-completer, where they can be included by any file that needs to use them. --- po/POTFILES.in | 1 + tools/virsh-completer.c | 306 +++++++++++++++++++++++++++++++++++++++++++ tools/virsh-completer.h | 12 ++ tools/virsh-domain-monitor.c | 287 ++-------------------------------------- tools/virsh-domain.c | 72 ++++++++++ tools/virsh-snapshot.c | 11 ++ 6 files changed, 414 insertions(+), 275 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 5a4112a..13f4041 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -226,6 +226,7 @@ src/xenxs/xen_xm.c tools/libvirt-guests.sh.in tools/virsh.c tools/virsh.h +tools/virsh-completer.c tools/virsh-console.c tools/virsh-domain-monitor.c tools/virsh-domain.c diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c index 3e6c8f8..43afab7 100644 --- a/tools/virsh-completer.c +++ b/tools/virsh-completer.c @@ -47,3 +47,309 @@ vshVarArgsToStringList(vshControl *ctl, unsigned int count, ...) return strs; }; + +/* Utils - Domain Listing */ +/* compare domains, pack NULLed ones at the end*/ +static int +vshDomainSorter(const void *a, const void *b) +{ + virDomainPtr *da = (virDomainPtr *) a; + virDomainPtr *db = (virDomainPtr *) b; + unsigned int ida; + unsigned int idb; + unsigned int inactive = (unsigned int) -1; + + if (*da && !*db) + return -1; + + if (!*da) + return *db != NULL; + + ida = virDomainGetID(*da); + idb = virDomainGetID(*db); + + if (ida == inactive && idb == inactive) + return vshStrcasecmp(virDomainGetName(*da), virDomainGetName(*db)); + + if (ida != inactive && idb != inactive) { + if (ida > idb) + return 1; + else if (ida < idb) + return -1; + } + + if (ida != inactive) + return -1; + else + return 1; +} + +void +vshDomainListFree(vshDomainListPtr domlist) +{ + size_t i; + + if (domlist && domlist->domains) { + for (i = 0; i < domlist->ndomains; i++) { + if (domlist->domains[i]) + virDomainFree(domlist->domains[i]); + } + VIR_FREE(domlist->domains); + } + VIR_FREE(domlist); +} + +vshDomainListPtr +vshDomainListCollect(vshControl *ctl, unsigned int flags) +{ + vshDomainListPtr list = vshMalloc(ctl, sizeof(*list)); + size_t i; + int ret; + int *ids = NULL; + int nids = 0; + char **names = NULL; + int nnames = 0; + virDomainPtr dom; + bool success = false; + size_t deleted = 0; + int persistent; + int autostart; + int state; + int nsnap; + int mansave; + + /* try the list with flags support (0.9.13 and later) */ + if ((ret = virConnectListAllDomains(ctl->conn, &list->domains, + flags)) >= 0) { + list->ndomains = ret; + goto finished; + } + + /* check if the command is actually supported */ + if (last_error && last_error->code == VIR_ERR_NO_SUPPORT) { + vshResetLibvirtError(); + goto fallback; + } + + if (last_error && last_error->code == VIR_ERR_INVALID_ARG) { + /* try the new API again but mask non-guaranteed flags */ + unsigned int newflags = flags & (VIR_CONNECT_LIST_DOMAINS_ACTIVE | + VIR_CONNECT_LIST_DOMAINS_INACTIVE); + + vshResetLibvirtError(); + if ((ret = virConnectListAllDomains(ctl->conn, &list->domains, + newflags)) >= 0) { + list->ndomains = ret; + goto filter; + } + } + + /* there was an error during the first or second call */ + vshError(ctl, "%s", _("Failed to list domains")); + goto cleanup; + + + fallback: + /* fall back to old method (0.9.12 and older) */ + vshResetLibvirtError(); + + /* list active domains, if necessary */ + if (!VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) || + VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE)) { + if ((nids = virConnectNumOfDomains(ctl->conn)) < 0) { + vshError(ctl, "%s", _("Failed to list active domains")); + goto cleanup; + } + + if (nids) { + ids = vshMalloc(ctl, sizeof(int) * nids); + + if ((nids = virConnectListDomains(ctl->conn, ids, nids)) < 0) { + vshError(ctl, "%s", _("Failed to list active domains")); + goto cleanup; + } + } + } + + if (!VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) || + VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE)) { + if ((nnames = virConnectNumOfDefinedDomains(ctl->conn)) < 0) { + vshError(ctl, "%s", _("Failed to list inactive domains")); + goto cleanup; + } + + if (nnames) { + names = vshMalloc(ctl, sizeof(char *) * nnames); + + if ((nnames = virConnectListDefinedDomains(ctl->conn, names, + nnames)) < 0) { + vshError(ctl, "%s", _("Failed to list inactive domains")); + goto cleanup; + } + } + } + + list->domains = vshMalloc(ctl, sizeof(virDomainPtr) * (nids + nnames)); + list->ndomains = 0; + + /* get active domains */ + for (i = 0; i < nids; i++) { + if (!(dom = virDomainLookupByID(ctl->conn, ids[i]))) + continue; + list->domains[list->ndomains++] = dom; + } + + /* get inactive domains */ + for (i = 0; i < nnames; i++) { + if (!(dom = virDomainLookupByName(ctl->conn, names[i]))) + continue; + list->domains[list->ndomains++] = dom; + } + + /* truncate domains that weren't found */ + deleted = (nids + nnames) - list->ndomains; + + filter: + /* filter list the list if the list was acquired by fallback means */ + for (i = 0; i < list->ndomains; i++) { + dom = list->domains[i]; + + /* persistence filter */ + if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT)) { + if ((persistent = virDomainIsPersistent(dom)) < 0) { + vshError(ctl, "%s", _("Failed to get domain persistence info")); + goto cleanup; + } + + if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_PERSISTENT) && persistent) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_TRANSIENT) && !persistent))) + goto remove_entry; + } + + /* domain state filter */ + if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE)) { + if (virDomainGetState(dom, &state, NULL, 0) < 0) { + vshError(ctl, "%s", _("Failed to get domain state")); + goto cleanup; + } + + if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_RUNNING) && + state == VIR_DOMAIN_RUNNING) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_PAUSED) && + state == VIR_DOMAIN_PAUSED) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_SHUTOFF) && + state == VIR_DOMAIN_SHUTOFF) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_OTHER) && + (state != VIR_DOMAIN_RUNNING && + state != VIR_DOMAIN_PAUSED && + state != VIR_DOMAIN_SHUTOFF)))) + goto remove_entry; + } + + /* autostart filter */ + if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_AUTOSTART)) { + if (virDomainGetAutostart(dom, &autostart) < 0) { + vshError(ctl, "%s", _("Failed to get domain autostart state")); + goto cleanup; + } + + if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_AUTOSTART) && autostart) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART) && !autostart))) + goto remove_entry; + } + + /* managed save filter */ + if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_MANAGEDSAVE)) { + if ((mansave = virDomainHasManagedSaveImage(dom, 0)) < 0) { + vshError(ctl, "%s", + _("Failed to check for managed save image")); + goto cleanup; + } + + if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE) && mansave) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE) && !mansave))) + goto remove_entry; + } + + /* snapshot filter */ + if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) { + if ((nsnap = virDomainSnapshotNum(dom, 0)) < 0) { + vshError(ctl, "%s", _("Failed to get snapshot count")); + goto cleanup; + } + if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) || + (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT) && nsnap == 0))) + goto remove_entry; + } + + /* the domain matched all filters, it may stay */ + continue; + + remove_entry: + /* the domain has to be removed as it failed one of the filters */ + virDomainFree(list->domains[i]); + list->domains[i] = NULL; + deleted++; + } + + finished: + /* sort the list */ + if (list->domains && list->ndomains) + qsort(list->domains, list->ndomains, sizeof(*list->domains), + vshDomainSorter); + + /* truncate the list if filter simulation deleted entries */ + if (deleted) + VIR_SHRINK_N(list->domains, list->ndomains, deleted); + + success = true; + + cleanup: + for (i = 0; nnames != -1 && i < nnames; i++) + VIR_FREE(names[i]); + + if (!success) { + vshDomainListFree(list); + list = NULL; + } + + VIR_FREE(names); + VIR_FREE(ids); + return list; +} + + +/* Common completers */ +char ** +vshCompleteDomain(unsigned int flags) +{ + vshControl *ctl = vshGetCompleterCtl(); + vshDomainListPtr dom_list = NULL; + virDomainPtr *domains = NULL; + char **names = NULL; + size_t i; + + if (!ctl) + return NULL; + + if (flags == 0) + flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE | + VIR_CONNECT_LIST_DOMAINS_INACTIVE; + + dom_list = vshDomainListCollect(ctl, flags); + + if (!dom_list) + return NULL; + + domains = dom_list->domains; + names = vshCalloc(ctl, dom_list->ndomains+1, sizeof(char*)); + + for (i = 0; i < dom_list->ndomains; i++) + names[i] = vshStrdup(ctl, virDomainGetName(domains[i])); + + names[dom_list->ndomains] = NULL; + + vshDomainListFree(dom_list); + + return names; +}; diff --git a/tools/virsh-completer.h b/tools/virsh-completer.h index a565c5d..06fa98e 100644 --- a/tools/virsh-completer.h +++ b/tools/virsh-completer.h @@ -70,4 +70,16 @@ char ** vshVarArgsToStringList(vshControl *ctl, unsigned int count, ...); +struct vshDomainList { + virDomainPtr *domains; + size_t ndomains; +}; +typedef struct vshDomainList *vshDomainListPtr; + +void vshDomainListFree(vshDomainListPtr domlist); + +vshDomainListPtr vshDomainListCollect(vshControl *ctl, unsigned int flags); + +char ** vshCompleteDomain(unsigned int flags); + #endif /* VIRSH_COMPLETER_H */ diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 18d551a..50cb920 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -25,6 +25,7 @@ #include <config.h> #include "virsh-domain-monitor.h" +#include "virsh-completer.h" #include <libxml/parser.h> #include <libxml/tree.h> @@ -268,6 +269,7 @@ static const vshCmdOptDef opts_dommemstat[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "period", @@ -392,6 +394,7 @@ static const vshCmdOptDef opts_domblkinfo[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "device", @@ -447,6 +450,7 @@ static const vshCmdOptDef opts_domblklist[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "inactive", @@ -569,6 +573,7 @@ static const vshCmdOptDef opts_domiflist[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "inactive", @@ -674,6 +679,7 @@ static const vshCmdOptDef opts_domif_getlink[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "interface", @@ -789,6 +795,7 @@ static const vshCmdOptDef opts_domcontrol[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = NULL} @@ -842,6 +849,7 @@ static const vshCmdOptDef opts_domblkstat[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "device", @@ -1032,6 +1040,7 @@ static const vshCmdOptDef opts_domifstat[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "interface", @@ -1109,6 +1118,7 @@ static const vshCmdOptDef opts_domblkerror[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id, or uuid") }, {.name = NULL} @@ -1174,6 +1184,7 @@ static const vshCmdOptDef opts_dominfo[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = NULL} @@ -1316,6 +1327,7 @@ static const vshCmdOptDef opts_domstate[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "reason", @@ -1368,281 +1380,6 @@ static const vshCmdInfo info_list[] = { {.name = NULL} }; -/* compare domains, pack NULLed ones at the end*/ -static int -vshDomainSorter(const void *a, const void *b) -{ - virDomainPtr *da = (virDomainPtr *) a; - virDomainPtr *db = (virDomainPtr *) b; - unsigned int ida; - unsigned int idb; - unsigned int inactive = (unsigned int) -1; - - if (*da && !*db) - return -1; - - if (!*da) - return *db != NULL; - - ida = virDomainGetID(*da); - idb = virDomainGetID(*db); - - if (ida == inactive && idb == inactive) - return vshStrcasecmp(virDomainGetName(*da), virDomainGetName(*db)); - - if (ida != inactive && idb != inactive) { - if (ida > idb) - return 1; - else if (ida < idb) - return -1; - } - - if (ida != inactive) - return -1; - else - return 1; -} - -struct vshDomainList { - virDomainPtr *domains; - size_t ndomains; -}; -typedef struct vshDomainList *vshDomainListPtr; - -static void -vshDomainListFree(vshDomainListPtr domlist) -{ - size_t i; - - if (domlist && domlist->domains) { - for (i = 0; i < domlist->ndomains; i++) { - if (domlist->domains[i]) - virDomainFree(domlist->domains[i]); - } - VIR_FREE(domlist->domains); - } - VIR_FREE(domlist); -} - -static vshDomainListPtr -vshDomainListCollect(vshControl *ctl, unsigned int flags) -{ - vshDomainListPtr list = vshMalloc(ctl, sizeof(*list)); - size_t i; - int ret; - int *ids = NULL; - int nids = 0; - char **names = NULL; - int nnames = 0; - virDomainPtr dom; - bool success = false; - size_t deleted = 0; - int persistent; - int autostart; - int state; - int nsnap; - int mansave; - - /* try the list with flags support (0.9.13 and later) */ - if ((ret = virConnectListAllDomains(ctl->conn, &list->domains, - flags)) >= 0) { - list->ndomains = ret; - goto finished; - } - - /* check if the command is actually supported */ - if (last_error && last_error->code == VIR_ERR_NO_SUPPORT) { - vshResetLibvirtError(); - goto fallback; - } - - if (last_error && last_error->code == VIR_ERR_INVALID_ARG) { - /* try the new API again but mask non-guaranteed flags */ - unsigned int newflags = flags & (VIR_CONNECT_LIST_DOMAINS_ACTIVE | - VIR_CONNECT_LIST_DOMAINS_INACTIVE); - - vshResetLibvirtError(); - if ((ret = virConnectListAllDomains(ctl->conn, &list->domains, - newflags)) >= 0) { - list->ndomains = ret; - goto filter; - } - } - - /* there was an error during the first or second call */ - vshError(ctl, "%s", _("Failed to list domains")); - goto cleanup; - - - fallback: - /* fall back to old method (0.9.12 and older) */ - vshResetLibvirtError(); - - /* list active domains, if necessary */ - if (!VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) || - VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE)) { - if ((nids = virConnectNumOfDomains(ctl->conn)) < 0) { - vshError(ctl, "%s", _("Failed to list active domains")); - goto cleanup; - } - - if (nids) { - ids = vshMalloc(ctl, sizeof(int) * nids); - - if ((nids = virConnectListDomains(ctl->conn, ids, nids)) < 0) { - vshError(ctl, "%s", _("Failed to list active domains")); - goto cleanup; - } - } - } - - if (!VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE) || - VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE)) { - if ((nnames = virConnectNumOfDefinedDomains(ctl->conn)) < 0) { - vshError(ctl, "%s", _("Failed to list inactive domains")); - goto cleanup; - } - - if (nnames) { - names = vshMalloc(ctl, sizeof(char *) * nnames); - - if ((nnames = virConnectListDefinedDomains(ctl->conn, names, - nnames)) < 0) { - vshError(ctl, "%s", _("Failed to list inactive domains")); - goto cleanup; - } - } - } - - list->domains = vshMalloc(ctl, sizeof(virDomainPtr) * (nids + nnames)); - list->ndomains = 0; - - /* get active domains */ - for (i = 0; i < nids; i++) { - if (!(dom = virDomainLookupByID(ctl->conn, ids[i]))) - continue; - list->domains[list->ndomains++] = dom; - } - - /* get inactive domains */ - for (i = 0; i < nnames; i++) { - if (!(dom = virDomainLookupByName(ctl->conn, names[i]))) - continue; - list->domains[list->ndomains++] = dom; - } - - /* truncate domains that weren't found */ - deleted = (nids + nnames) - list->ndomains; - - filter: - /* filter list the list if the list was acquired by fallback means */ - for (i = 0; i < list->ndomains; i++) { - dom = list->domains[i]; - - /* persistence filter */ - if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT)) { - if ((persistent = virDomainIsPersistent(dom)) < 0) { - vshError(ctl, "%s", _("Failed to get domain persistence info")); - goto cleanup; - } - - if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_PERSISTENT) && persistent) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_TRANSIENT) && !persistent))) - goto remove_entry; - } - - /* domain state filter */ - if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE)) { - if (virDomainGetState(dom, &state, NULL, 0) < 0) { - vshError(ctl, "%s", _("Failed to get domain state")); - goto cleanup; - } - - if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_RUNNING) && - state == VIR_DOMAIN_RUNNING) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_PAUSED) && - state == VIR_DOMAIN_PAUSED) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_SHUTOFF) && - state == VIR_DOMAIN_SHUTOFF) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_OTHER) && - (state != VIR_DOMAIN_RUNNING && - state != VIR_DOMAIN_PAUSED && - state != VIR_DOMAIN_SHUTOFF)))) - goto remove_entry; - } - - /* autostart filter */ - if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_AUTOSTART)) { - if (virDomainGetAutostart(dom, &autostart) < 0) { - vshError(ctl, "%s", _("Failed to get domain autostart state")); - goto cleanup; - } - - if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_AUTOSTART) && autostart) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART) && !autostart))) - goto remove_entry; - } - - /* managed save filter */ - if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_MANAGEDSAVE)) { - if ((mansave = virDomainHasManagedSaveImage(dom, 0)) < 0) { - vshError(ctl, "%s", - _("Failed to check for managed save image")); - goto cleanup; - } - - if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE) && mansave) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE) && !mansave))) - goto remove_entry; - } - - /* snapshot filter */ - if (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT)) { - if ((nsnap = virDomainSnapshotNum(dom, 0)) < 0) { - vshError(ctl, "%s", _("Failed to get snapshot count")); - goto cleanup; - } - if (!((VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) && nsnap > 0) || - (VSH_MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT) && nsnap == 0))) - goto remove_entry; - } - - /* the domain matched all filters, it may stay */ - continue; - - remove_entry: - /* the domain has to be removed as it failed one of the filters */ - virDomainFree(list->domains[i]); - list->domains[i] = NULL; - deleted++; - } - - finished: - /* sort the list */ - if (list->domains && list->ndomains) - qsort(list->domains, list->ndomains, sizeof(*list->domains), - vshDomainSorter); - - /* truncate the list if filter simulation deleted entries */ - if (deleted) - VIR_SHRINK_N(list->domains, list->ndomains, deleted); - - success = true; - - cleanup: - for (i = 0; nnames != -1 && i < nnames; i++) - VIR_FREE(names[i]); - - if (!success) { - vshDomainListFree(list); - list = NULL; - } - - VIR_FREE(names); - VIR_FREE(ids); - return list; -} - static const vshCmdOptDef opts_list[] = { {.name = "inactive", .type = VSH_OT_BOOL, diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index d9aa4fa..ce17fa4 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -25,6 +25,7 @@ #include <config.h> #include "virsh-domain.h" +#include "virsh-completer.h" #include <fcntl.h> #include <poll.h> @@ -161,6 +162,7 @@ static const vshCmdInfo info_attach_device[] = { static const vshCmdOptDef opts_attach_device[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -263,6 +265,7 @@ static const vshCmdInfo info_attach_disk[] = { static const vshCmdOptDef opts_attach_disk[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -703,6 +706,7 @@ static const vshCmdInfo info_attach_interface[] = { static const vshCmdOptDef opts_attach_interface[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -960,6 +964,7 @@ static const vshCmdInfo info_autostart[] = { static const vshCmdOptDef opts_autostart[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -1016,6 +1021,7 @@ static const vshCmdInfo info_blkdeviotune[] = { static const vshCmdOptDef opts_blkdeviotune[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -1240,6 +1246,7 @@ static const vshCmdInfo info_blkiotune[] = { static const vshCmdOptDef opts_blkiotune[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -1567,6 +1574,7 @@ static const vshCmdInfo info_block_commit[] = { static const vshCmdOptDef opts_block_commit[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -1735,6 +1743,7 @@ static const vshCmdInfo info_block_copy[] = { static const vshCmdOptDef opts_block_copy[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -1930,6 +1939,7 @@ static const vshCmdInfo info_block_job[] = { static const vshCmdOptDef opts_block_job[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2031,6 +2041,7 @@ static const vshCmdInfo info_block_pull[] = { static const vshCmdOptDef opts_block_pull[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2186,6 +2197,7 @@ static const vshCmdInfo info_block_resize[] = { static const vshCmdOptDef opts_block_resize[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2256,6 +2268,7 @@ static const vshCmdInfo info_console[] = { static const vshCmdOptDef opts_console[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2353,6 +2366,7 @@ static const vshCmdInfo info_domif_setlink[] = { static const vshCmdOptDef opts_domif_setlink[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2540,6 +2554,7 @@ static const vshCmdInfo info_domiftune[] = { static const vshCmdOptDef opts_domiftune[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2727,6 +2742,7 @@ static const vshCmdInfo info_suspend[] = { static const vshCmdOptDef opts_suspend[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2773,6 +2789,7 @@ static const vshCmdInfo info_dom_pm_suspend[] = { static const vshCmdOptDef opts_dom_pm_suspend[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2857,6 +2874,7 @@ static const vshCmdInfo info_dom_pm_wakeup[] = { static const vshCmdOptDef opts_dom_pm_wakeup[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -2906,6 +2924,7 @@ static const vshCmdInfo info_undefine[] = { static const vshCmdOptDef opts_undefine[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name or uuid") @@ -3299,6 +3318,7 @@ static const vshCmdInfo info_start[] = { static const vshCmdOptDef opts_start[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("name of the inactive domain") @@ -3482,6 +3502,7 @@ static const vshCmdOptDef opts_save[] = { .help = N_("avoid file system cache when saving") }, {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -3951,6 +3972,7 @@ static const vshCmdOptDef opts_managedsave[] = { .help = N_("avoid file system cache when saving") }, {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4071,6 +4093,7 @@ static const vshCmdInfo info_managedsaveremove[] = { static const vshCmdOptDef opts_managedsaveremove[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4130,6 +4153,7 @@ static const vshCmdInfo info_schedinfo[] = { static const vshCmdOptDef opts_schedinfo[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4473,6 +4497,7 @@ static const vshCmdOptDef opts_dump[] = { .help = N_("reset the domain after core dump") }, {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4640,6 +4665,7 @@ static const vshCmdInfo info_screenshot[] = { static const vshCmdOptDef opts_screenshot[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4788,6 +4814,7 @@ static const vshCmdInfo info_resume[] = { static const vshCmdOptDef opts_resume[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4831,6 +4858,7 @@ static const vshCmdInfo info_shutdown[] = { static const vshCmdOptDef opts_shutdown[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4917,6 +4945,7 @@ static const vshCmdInfo info_reboot[] = { static const vshCmdOptDef opts_reboot[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -4998,6 +5027,7 @@ static const vshCmdInfo info_reset[] = { static const vshCmdOptDef opts_reset[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -5041,6 +5071,7 @@ static const vshCmdInfo info_domjobinfo[] = { static const vshCmdOptDef opts_domjobinfo[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -5263,6 +5294,7 @@ static const vshCmdInfo info_domjobabort[] = { static const vshCmdOptDef opts_domjobabort[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -5301,6 +5333,7 @@ static const vshCmdInfo info_vcpucount[] = { static const vshCmdOptDef opts_vcpucount[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -5512,6 +5545,7 @@ static const vshCmdInfo info_vcpuinfo[] = { static const vshCmdOptDef opts_vcpuinfo[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -5621,6 +5655,7 @@ static const vshCmdInfo info_vcpupin[] = { static const vshCmdOptDef opts_vcpupin[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -5908,6 +5943,7 @@ static const vshCmdInfo info_emulatorpin[] = { static const vshCmdOptDef opts_emulatorpin[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -6027,6 +6063,7 @@ static const vshCmdInfo info_setvcpus[] = { static const vshCmdOptDef opts_setvcpus[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -6348,6 +6385,7 @@ static const vshCmdInfo info_cpu_stats[] = { static const vshCmdOptDef opts_cpu_stats[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -6682,6 +6720,7 @@ static const vshCmdInfo info_destroy[] = { static const vshCmdOptDef opts_destroy[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -6739,6 +6778,7 @@ static const vshCmdInfo info_desc[] = { static const vshCmdOptDef opts_desc[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -6911,6 +6951,7 @@ static const vshCmdInfo info_metadata[] = { static const vshCmdOptDef opts_metadata[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7068,6 +7109,7 @@ static const vshCmdInfo info_inject_nmi[] = { static const vshCmdOptDef opts_inject_nmi[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7106,6 +7148,7 @@ static const vshCmdInfo info_send_key[] = { static const vshCmdOptDef opts_send_key[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7208,6 +7251,7 @@ static const vshCmdInfo info_send_process_signal[] = { static const vshCmdOptDef opts_send_process_signal[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7323,6 +7367,7 @@ static const vshCmdInfo info_setmem[] = { static const vshCmdOptDef opts_setmem[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7420,6 +7465,7 @@ static const vshCmdInfo info_setmaxmem[] = { static const vshCmdOptDef opts_setmaxmem[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7522,6 +7568,7 @@ static const vshCmdInfo info_memtune[] = { static const vshCmdOptDef opts_memtune[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7721,6 +7768,7 @@ static const vshCmdInfo info_numatune[] = { static const vshCmdOptDef opts_numatune[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -7868,6 +7916,7 @@ static const vshCmdInfo info_qemu_monitor_command[] = { static const vshCmdOptDef opts_qemu_monitor_command[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -8160,6 +8209,7 @@ static const vshCmdInfo info_qemu_agent_command[] = { static const vshCmdOptDef opts_qemu_agent_command[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -8289,6 +8339,7 @@ static const vshCmdInfo info_lxc_enter_namespace[] = { static const vshCmdOptDef opts_lxc_enter_namespace[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -8431,6 +8482,7 @@ static const vshCmdInfo info_dumpxml[] = { static const vshCmdOptDef opts_dumpxml[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -8617,6 +8669,7 @@ static const vshCmdInfo info_domname[] = { static const vshCmdOptDef opts_domname[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain id or uuid") @@ -8653,6 +8706,7 @@ static const vshCmdInfo info_domid[] = { static const vshCmdOptDef opts_domid[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name or uuid") @@ -8694,6 +8748,7 @@ static const vshCmdInfo info_domuuid[] = { static const vshCmdOptDef opts_domuuid[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain id or name") @@ -8803,6 +8858,7 @@ static const vshCmdOptDef opts_migrate[] = { .help = N_("abort on soft errors during migration") }, {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9073,6 +9129,7 @@ static const vshCmdInfo info_migrate_setmaxdowntime[] = { static const vshCmdOptDef opts_migrate_setmaxdowntime[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9127,6 +9184,7 @@ static const vshCmdInfo info_migrate_compcache[] = { static const vshCmdOptDef opts_migrate_compcache[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9189,6 +9247,7 @@ static const vshCmdInfo info_migrate_setspeed[] = { static const vshCmdOptDef opts_migrate_setspeed[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9241,6 +9300,7 @@ static const vshCmdInfo info_migrate_getspeed[] = { static const vshCmdOptDef opts_migrate_getspeed[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9285,6 +9345,7 @@ static const vshCmdInfo info_domdisplay[] = { static const vshCmdOptDef opts_domdisplay[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9472,6 +9533,7 @@ static const vshCmdInfo info_vncdisplay[] = { static const vshCmdOptDef opts_vncdisplay[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9545,6 +9607,7 @@ static const vshCmdInfo info_ttyconsole[] = { static const vshCmdOptDef opts_ttyconsole[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9605,6 +9668,7 @@ static const vshCmdInfo info_domhostname[] = { static const vshCmdOptDef opts_domhostname[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9768,6 +9832,7 @@ static const vshCmdInfo info_detach_device[] = { static const vshCmdOptDef opts_detach_device[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9869,6 +9934,7 @@ static const vshCmdInfo info_update_device[] = { static const vshCmdOptDef opts_update_device[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -9971,6 +10037,7 @@ static const vshCmdInfo info_detach_interface[] = { static const vshCmdOptDef opts_detach_interface[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -10341,6 +10408,7 @@ static const vshCmdInfo info_detach_disk[] = { static const vshCmdOptDef opts_detach_disk[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -10456,6 +10524,7 @@ static const vshCmdInfo info_edit[] = { static const vshCmdOptDef opts_edit[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -11041,6 +11110,7 @@ static const vshCmdInfo info_event[] = { static const vshCmdOptDef opts_event[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .help = N_("filter by domain name, id, or uuid") }, @@ -11193,6 +11263,7 @@ static const vshCmdInfo info_change_media[] = { static const vshCmdOptDef opts_change_media[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") @@ -11344,6 +11415,7 @@ static const vshCmdInfo info_domfstrim[] = { static const vshCmdOptDef opts_domfstrim[] = { {.name = "domain", + .completer = vshCompleteDomain, .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c index 3ecb3de..97eb264 100644 --- a/tools/virsh-snapshot.c +++ b/tools/virsh-snapshot.c @@ -25,6 +25,7 @@ #include <config.h> #include "virsh-snapshot.h" +#include "virsh-completer.h" #include <assert.h> @@ -125,6 +126,7 @@ static const vshCmdOptDef opts_snapshot_create[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "xmlfile", @@ -330,6 +332,7 @@ static const vshCmdOptDef opts_snapshot_create_as[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "name", @@ -526,6 +529,7 @@ static const vshCmdOptDef opts_snapshot_edit[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "snapshotname", @@ -648,6 +652,7 @@ static const vshCmdOptDef opts_snapshot_current[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "name", @@ -884,6 +889,7 @@ static const vshCmdOptDef opts_snapshot_info[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "snapshotname", @@ -1441,6 +1447,7 @@ static const vshCmdOptDef opts_snapshot_list[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "parent", @@ -1705,6 +1712,7 @@ static const vshCmdOptDef opts_snapshot_dumpxml[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "snapshotname", @@ -1773,6 +1781,7 @@ static const vshCmdOptDef opts_snapshot_parent[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "snapshotname", @@ -1841,6 +1850,7 @@ static const vshCmdOptDef opts_snapshot_revert[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "snapshotname", @@ -1934,6 +1944,7 @@ static const vshCmdOptDef opts_snapshot_delete[] = { {.name = "domain", .type = VSH_OT_DATA, .flags = VSH_OFLAG_REQ, + .completer = vshCompleteDomain, .help = N_("domain name, id or uuid") }, {.name = "snapshotname", -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list