From b21631f3b5cdecd14114034cd9e4e7f63ed7fde1 Mon Sep 17 00:00:00 2001 From: Hani Benhabiles Date: Tue, 27 May 2014 23:39:37 +0100 Subject: [PATCH] monitor: Add delvm and loadvm argument completion Signed-off-by: Hani Benhabiles Signed-off-by: Luiz Capitulino --- hmp-commands.hx | 2 ++ hmp.h | 2 ++ monitor.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/hmp-commands.hx b/hmp-commands.hx index f99da0efe4..5f1a677b85 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -335,6 +335,7 @@ ETEXI .params = "tag|id", .help = "restore a VM snapshot from its tag or id", .mhandler.cmd = do_loadvm, + .command_completion = loadvm_completion, }, STEXI @@ -350,6 +351,7 @@ ETEXI .params = "tag|id", .help = "delete a VM snapshot from its tag or id", .mhandler.cmd = do_delvm, + .command_completion = delvm_completion, }, STEXI diff --git a/hmp.h b/hmp.h index a53ad51602..2d9b0a2b0b 100644 --- a/hmp.h +++ b/hmp.h @@ -112,5 +112,7 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args, void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str); void host_net_remove_completion(ReadLineState *rs, int nb_args, const char *str); +void delvm_completion(ReadLineState *rs, int nb_args, const char *str); +void loadvm_completion(ReadLineState *rs, int nb_args, const char *str); #endif diff --git a/monitor.c b/monitor.c index d6c4f85909..ee9390f659 100644 --- a/monitor.c +++ b/monitor.c @@ -70,6 +70,7 @@ #include "qmp-commands.h" #include "hmp.h" #include "qemu/thread.h" +#include "block/qapi.h" /* for pic/irq_info */ #if defined(TARGET_SPARC) @@ -4648,6 +4649,53 @@ void host_net_remove_completion(ReadLineState *rs, int nb_args, const char *str) } } +static void vm_completion(ReadLineState *rs, const char *str) +{ + size_t len; + BlockDriverState *bs = NULL; + + len = strlen(str); + readline_set_completion_index(rs, len); + while ((bs = bdrv_next(bs))) { + SnapshotInfoList *snapshots, *snapshot; + + if (!bdrv_can_snapshot(bs)) { + continue; + } + if (bdrv_query_snapshot_info_list(bs, &snapshots, NULL)) { + continue; + } + snapshot = snapshots; + while (snapshot) { + char *completion = snapshot->value->name; + if (!strncmp(str, completion, len)) { + readline_add_completion(rs, completion); + } + completion = snapshot->value->id; + if (!strncmp(str, completion, len)) { + readline_add_completion(rs, completion); + } + snapshot = snapshot->next; + } + qapi_free_SnapshotInfoList(snapshots); + } + +} + +void delvm_completion(ReadLineState *rs, int nb_args, const char *str) +{ + if (nb_args == 2) { + vm_completion(rs, str); + } +} + +void loadvm_completion(ReadLineState *rs, int nb_args, const char *str) +{ + if (nb_args == 2) { + vm_completion(rs, str); + } +} + static void monitor_find_completion_by_table(Monitor *mon, const mon_cmd_t *cmd_table, char **args, -- 2.11.4.GIT