This completer allows selection of active and/or inactive domains so
only domains in valid state for a command are listed, e.g. only inactive
for 'start' command, active for 'shutdown' and so on.
---
tools/virsh.c | 250 +++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 199 insertions(+), 51 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index 3dabb10..6a63363 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -600,6 +600,119 @@ vshReconnect(vshControl *ctl)
}
/* ---------------
+ * Completers
+ * ---------------
+ */
+#define ACTIVE (1<<0)
+#define INACTIVE (1<<1)
+static char *
+complt_listDomainsFlags(const char *text ATTRIBUTE_UNUSED, int state, unsigned int
flags)
+{
+ static int len = 0;
+ static int index_active = 0;
+ static int index_inactive = 0;
+ static int maxid = 0;
+ static int *ids = NULL;
+ static int maxname = 0;
+ static char **names = NULL;
+ char *ret;
+
+ /*
+ * TODO:
+ * If we are not connected, should we connect here
+ * or simply return NULL and thus not complete 'live data'?
+ */
+ if (!conn)
+ return NULL;
+
+ if (!state) {
+ len = strlen(text);
+ maxid = 0;
+ maxname = 0;
+
+ if (flags & ACTIVE) {
+ maxid = virConnectNumOfDomains(conn);
+ if (maxid < 0)
+ goto cleanup;
+ if (maxid) {
+ ids = vshMalloc(NULL, sizeof(int) * maxid);
+ if ((maxid = virConnectListDomains(conn, ids, maxid)) < 0)
+ goto cleanup;
+
+ qsort(ids, maxid, sizeof(int), idsorter);
+ }
+ }
+ if (flags & INACTIVE) {
+ maxname = virConnectNumOfDefinedDomains(conn);
+ if (maxname < 0)
+ goto cleanup;
+ if (maxname) {
+ names = vshMalloc(NULL, sizeof(char *) * maxname);
+ if ((maxname =
+ virConnectListDefinedDomains(conn, names, maxname)) < 0)
+ goto cleanup;
+
+ qsort(names, maxname, sizeof(char *), namesorter);
+ }
+ }
+
+ index_active = 0;
+ index_inactive = 0;
+ }
+
+ while (index_active < maxid) {
+ virDomainPtr dom = virDomainLookupByID(conn, ids[index_active]);
+ index_active++;
+
+ if (!dom)
+ continue;
+
+ ret = (char *) virDomainGetName(dom);
+ if (STRNEQLEN(ret, text, len)) {
+ virDomainFree(dom);
+ continue;
+ }
+ ret = vshStrdup(NULL, ret);
+ virDomainFree(dom);
+
+ return ret;
+ }
+
+ while (index_inactive < maxname) {
+ ret = names[index_inactive];
+ index_inactive++;
+
+ if (STREQLEN(ret, text, len))
+ return ret;
+
+ VIR_FREE(ret);
+ }
+
+cleanup:
+ VIR_FREE(ids);
+ VIR_FREE(names);
+ return NULL;
+}
+
+static char *
+complt_listActiveDomains(const char *text, int state)
+{
+ return complt_listDomainsFlags(text, state, ACTIVE);
+}
+
+static char *
+complt_listInactiveDomains(const char *text, int state)
+{
+ return complt_listDomainsFlags(text, state, INACTIVE);
+}
+
+static char *
+complt_listAllDomains(const char *text, int state)
+{
+ return complt_listDomainsFlags(text, state, ACTIVE | INACTIVE);
+}
+
+/* ---------------
* Commands
* ---------------
*/
@@ -11615,84 +11728,119 @@ cleanup:
static const vshCmdDef domManagementCmds[] = {
{"attach-device", cmdAttachDevice, opts_attach_device,
- info_attach_device, 0, NULL},
+ info_attach_device, 0, complt_listAllDomains},
{"attach-disk", cmdAttachDisk, opts_attach_disk,
- info_attach_disk, 0, NULL},
+ info_attach_disk, 0, complt_listAllDomains},
{"attach-interface", cmdAttachInterface, opts_attach_interface,
- info_attach_interface, 0, NULL},
- {"autostart", cmdAutostart, opts_autostart, info_autostart, 0, NULL},
- {"blkiotune", cmdBlkiotune, opts_blkiotune, info_blkiotune, 0, NULL},
+ info_attach_interface, 0, complt_listAllDomains},
+ {"autostart", cmdAutostart, opts_autostart,
+ info_autostart, 0, complt_listAllDomains},
+ {"blkiotune", cmdBlkiotune, opts_blkiotune,
+ info_blkiotune, 0, complt_listAllDomains},
#ifndef WIN32
- {"console", cmdConsole, opts_console, info_console, 0, NULL},
+ {"console", cmdConsole, opts_console,
+ info_console, 0, complt_listActiveDomains},
#endif
{"cpu-baseline", cmdCPUBaseline, opts_cpu_baseline,
info_cpu_baseline, 0, NULL},
{"cpu-compare", cmdCPUCompare, opts_cpu_compare, info_cpu_compare, 0,
NULL},
{"create", cmdCreate, opts_create, info_create, 0, NULL},
{"define", cmdDefine, opts_define, info_define, 0, NULL},
- {"destroy", cmdDestroy, opts_destroy, info_destroy, 0, NULL},
+ {"destroy", cmdDestroy, opts_destroy,
+ info_destroy, 0, complt_listActiveDomains},
{"detach-device", cmdDetachDevice, opts_detach_device,
- info_detach_device, 0, NULL},
- {"detach-disk", cmdDetachDisk, opts_detach_disk, info_detach_disk, 0,
NULL},
+ info_detach_device, 0, complt_listAllDomains},
+ {"detach-disk", cmdDetachDisk, opts_detach_disk,
+ info_detach_disk, 0, complt_listAllDomains},
{"detach-interface", cmdDetachInterface, opts_detach_interface,
- info_detach_interface, 0, NULL},
- {"domid", cmdDomid, opts_domid, info_domid, 0, NULL},
+ info_detach_interface, 0, complt_listAllDomains},
+ {"domid", cmdDomid, opts_domid, info_domid, 0, complt_listActiveDomains},
{"domjobabort", cmdDomjobabort, opts_domjobabort,
- info_domjobabort, 0, NULL},
- {"domjobinfo", cmdDomjobinfo, opts_domjobinfo, info_domjobinfo, 0, NULL},
- {"domname", cmdDomname, opts_domname, info_domname, 0, NULL},
- {"domuuid", cmdDomuuid, opts_domuuid, info_domuuid, 0, NULL},
+ info_domjobabort, 0, complt_listActiveDomains},
+ {"domjobinfo", cmdDomjobinfo, opts_domjobinfo,
+ info_domjobinfo, 0, complt_listActiveDomains},
+ {"domname", cmdDomname, opts_domname,
+ info_domname, 0, complt_listAllDomains},
+ {"domuuid", cmdDomuuid, opts_domuuid,
+ info_domuuid, 0, complt_listAllDomains},
{"domxml-from-native", cmdDomXMLFromNative, opts_domxmlfromnative,
info_domxmlfromnative, 0, NULL},
{"domxml-to-native", cmdDomXMLToNative, opts_domxmltonative,
info_domxmltonative, 0, NULL},
- {"dump", cmdDump, opts_dump, info_dump, 0, NULL},
- {"dumpxml", cmdDumpXML, opts_dumpxml, info_dumpxml, 0, NULL},
- {"edit", cmdEdit, opts_edit, info_edit, 0, NULL},
- {"inject-nmi", cmdInjectNMI, opts_inject_nmi, info_inject_nmi, 0, NULL},
+ {"dump", cmdDump, opts_dump, info_dump, 0, complt_listActiveDomains},
+ {"dumpxml", cmdDumpXML, opts_dumpxml,
+ info_dumpxml, 0, complt_listAllDomains},
+ {"edit", cmdEdit, opts_edit, info_edit, 0, complt_listAllDomains},
+ {"inject-nmi", cmdInjectNMI, opts_inject_nmi,
+ info_inject_nmi, 0, complt_listActiveDomains},
{"managedsave", cmdManagedSave, opts_managedsave,
- info_managedsave, 0, NULL},
+ info_managedsave, 0, complt_listActiveDomains},
{"managedsave-remove", cmdManagedSaveRemove, opts_managedsaveremove,
- info_managedsaveremove, 0, NULL},
+ info_managedsaveremove, 0, complt_listAllDomains},
{"maxvcpus", cmdMaxvcpus, opts_maxvcpus, info_maxvcpus, 0, NULL},
- {"memtune", cmdMemtune, opts_memtune, info_memtune, 0, NULL},
- {"migrate", cmdMigrate, opts_migrate, info_migrate, 0, NULL},
+ {"memtune", cmdMemtune, opts_memtune,
+ info_memtune, 0, complt_listAllDomains},
+ {"migrate", cmdMigrate, opts_migrate,
+ info_migrate, 0, complt_listAllDomains},
{"migrate-setmaxdowntime", cmdMigrateSetMaxDowntime,
- opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime, 0, NULL},
+ opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime, 0,
+ complt_listAllDomains},
{"migrate-setspeed", cmdMigrateSetMaxSpeed,
- opts_migrate_setspeed, info_migrate_setspeed, 0, NULL},
- {"reboot", cmdReboot, opts_reboot, info_reboot, 0, NULL},
- {"restore", cmdRestore, opts_restore, info_restore, 0, NULL},
- {"resume", cmdResume, opts_resume, info_resume, 0, NULL},
- {"save", cmdSave, opts_save, info_save, 0, NULL},
- {"schedinfo", cmdSchedinfo, opts_schedinfo, info_schedinfo, 0, NULL},
- {"screenshot", cmdScreenshot, opts_screenshot, info_screenshot, 0, NULL},
- {"setmaxmem", cmdSetmaxmem, opts_setmaxmem, info_setmaxmem, 0, NULL},
- {"setmem", cmdSetmem, opts_setmem, info_setmem, 0, NULL},
- {"setvcpus", cmdSetvcpus, opts_setvcpus, info_setvcpus, 0, NULL},
- {"shutdown", cmdShutdown, opts_shutdown, info_shutdown, 0, NULL},
- {"start", cmdStart, opts_start, info_start, 0, NULL},
- {"suspend", cmdSuspend, opts_suspend, info_suspend, 0, NULL},
- {"ttyconsole", cmdTTYConsole, opts_ttyconsole, info_ttyconsole, 0, NULL},
- {"undefine", cmdUndefine, opts_undefine, info_undefine, 0, NULL},
+ opts_migrate_setspeed, info_migrate_setspeed, 0, complt_listAllDomains},
+ {"reboot", cmdReboot, opts_reboot,
+ info_reboot, 0, complt_listActiveDomains},
+ {"restore", cmdRestore, opts_restore,
+ info_restore, 0, complt_listInactiveDomains},
+ {"resume", cmdResume, opts_resume,
+ info_resume, 0, complt_listActiveDomains},
+ {"save", cmdSave, opts_save, info_save, 0, complt_listActiveDomains},
+ {"schedinfo", cmdSchedinfo, opts_schedinfo,
+ info_schedinfo, 0, complt_listAllDomains},
+ {"screenshot", cmdScreenshot, opts_screenshot,
+ info_screenshot, 0, complt_listActiveDomains},
+ {"setmaxmem", cmdSetmaxmem, opts_setmaxmem,
+ info_setmaxmem, 0, complt_listAllDomains},
+ {"setmem", cmdSetmem, opts_setmem, info_setmem, 0, complt_listAllDomains},
+ {"setvcpus", cmdSetvcpus, opts_setvcpus,
+ info_setvcpus, 0, complt_listAllDomains},
+ {"shutdown", cmdShutdown, opts_shutdown,
+ info_shutdown, 0, complt_listActiveDomains},
+ {"start", cmdStart, opts_start, info_start, 0,
complt_listInactiveDomains},
+ {"suspend", cmdSuspend, opts_suspend,
+ info_suspend, 0, complt_listActiveDomains},
+ {"ttyconsole", cmdTTYConsole, opts_ttyconsole,
+ info_ttyconsole, 0, complt_listActiveDomains},
+ {"undefine", cmdUndefine, opts_undefine,
+ info_undefine, 0, complt_listInactiveDomains},
{"update-device", cmdUpdateDevice, opts_update_device,
- info_update_device, 0, NULL},
- {"vcpucount", cmdVcpucount, opts_vcpucount, info_vcpucount, 0, NULL},
- {"vcpuinfo", cmdVcpuinfo, opts_vcpuinfo, info_vcpuinfo, 0, NULL},
- {"vcpupin", cmdVcpuPin, opts_vcpupin, info_vcpupin, 0, NULL},
+ info_update_device, 0, complt_listAllDomains},
+ {"vcpucount", cmdVcpucount, opts_vcpucount,
+ info_vcpucount, 0, complt_listAllDomains},
+ {"vcpuinfo", cmdVcpuinfo, opts_vcpuinfo,
+ info_vcpuinfo, 0, complt_listAllDomains},
+ {"vcpupin", cmdVcpuPin, opts_vcpupin,
+ info_vcpupin, 0, complt_listAllDomains},
{"version", cmdVersion, opts_version, info_version, 0, NULL},
- {"vncdisplay", cmdVNCDisplay, opts_vncdisplay, info_vncdisplay, 0, NULL},
+ {"vncdisplay", cmdVNCDisplay, opts_vncdisplay,
+ info_vncdisplay, 0, complt_listActiveDomains},
{NULL, NULL, NULL, NULL, 0, NULL}
};
static const vshCmdDef domMonitoringCmds[] = {
- {"domblkinfo", cmdDomblkinfo, opts_domblkinfo, info_domblkinfo, 0, NULL},
- {"domblkstat", cmdDomblkstat, opts_domblkstat, info_domblkstat, 0, NULL},
- {"domcontrol", cmdDomControl, opts_domcontrol, info_domcontrol, 0, NULL},
- {"domifstat", cmdDomIfstat, opts_domifstat, info_domifstat, 0, NULL},
- {"dominfo", cmdDominfo, opts_dominfo, info_dominfo, 0, NULL},
- {"dommemstat", cmdDomMemStat, opts_dommemstat, info_dommemstat, 0, NULL},
- {"domstate", cmdDomstate, opts_domstate, info_domstate, 0, NULL},
+ {"domblkinfo", cmdDomblkinfo, opts_domblkinfo,
+ info_domblkinfo, 0, complt_listActiveDomains},
+ {"domblkstat", cmdDomblkstat, opts_domblkstat,
+ info_domblkstat, 0, complt_listActiveDomains},
+ {"domcontrol", cmdDomControl, opts_domcontrol,
+ info_domcontrol, 0, complt_listActiveDomains},
+ {"domifstat", cmdDomIfstat, opts_domifstat,
+ info_domifstat, 0, complt_listActiveDomains},
+ {"dominfo", cmdDominfo, opts_dominfo,
+ info_dominfo, 0, complt_listAllDomains},
+ {"dommemstat", cmdDomMemStat, opts_dommemstat,
+ info_dommemstat, 0, complt_listActiveDomains},
+ {"domstate", cmdDomstate, opts_domstate,
+ info_domstate, 0, complt_listAllDomains},
{"list", cmdList, opts_list, info_list, 0, NULL},
{NULL, NULL, NULL, NULL, 0, NULL}
};
--
1.7.5.rc3