monitor: Command completion for various commands
A set of patches adding completion support for various hmp commands. Following other series that were merged earlier.
Hani Benhabiles (7):
monitor: Add ringbuf_write and ringbuf_read argument completion.
monitor: Add watchdog_action argument completion.
monitor: Add migrate_set_capability completion.
monitor: Add host_net_add device argument completion.
readline: Make completion strings always unique.
monitor: Add host_net_remove arguments completion.
monitor: Add delvm and loadvm argument completion.
hmp-commands.hx | 10 ++- hmp.h | 11 ++++ include/sysemu/char.h | 3 +- monitor.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++ qemu-char.c | 2 +- util/readline.c | 6 ++ 6 files changed, 202 insertions(+), 4 deletions(-)
Signature · 1 line
1.8.3.2
PATCH 1/7 monitor: Add ringbuf_write and ringbuf_read argument completion.
Export chr_is_ringbuf() function. Also remove left-over function prototypes while at it.
--- hmp-commands.hx | 2 ++ hmp.h | 2 ++ include/sysemu/char.h | 3 +-- monitor.c | 39 +++++++++++++++++++++++++++++++++++++++ qemu-char.c | 2 +- 5 files changed, 45 insertions(+), 3 deletions(-)
hmp-commands.hx +2 -0
@@ -852,6 +852,7 @@ ETEXI .params = "device data", .help = "Write to a ring buffer character device", .mhandler.cmd = hmp_ringbuf_write, + .command_completion = ringbuf_write_completion, }, STEXI
@@ -868,6 +869,7 @@ ETEXI .params = "device size", .help = "Read from a ring buffer character device", .mhandler.cmd = hmp_ringbuf_read, + .command_completion = ringbuf_write_completion, }, STEXI
hmp.h +2 -0
@@ -103,5 +103,7 @@ void chardev_add_completion(ReadLineState *rs, int nb_args, const char *str);void set_link_completion (ReadLineState *rs,int nb_args,const char *str);void netdev_add_completion (ReadLineState *rs,int nb_args,const char *str);void netdev_del_completion (ReadLineState *rs,int nb_args,const char *str); +void ringbuf_write_completion (ReadLineState *rs,int nb_args,const char *str); +void ringbuf_read_completion (ReadLineState *rs,int nb_args,const char *str);#endif
include/sysemu/char.h +1 -2
@@ -286,9 +286,8 @@ void qemu_chr_add_handlers(CharDriverState *s,void qemu_chr_be_generic_open (CharDriverState *s);void qemu_chr_accept_input (CharDriverState *s);int qemu_chr_add_client (CharDriverState *s,int fd); -void qemu_chr_info_print (Monitor *mon,const QObject *ret_data); -void qemu_chr_info (Monitor *mon,QObject **ret_data);CharDriverState *qemu_chr_find (const char *name); +bool chr_is_ringbuf (const CharDriverState *chr);QemuOpts *qemu_chr_parse_compat (const char *label,const char *filename);
monitor.c +39 -0
@@ -4411,6 +4411,45 @@ void chardev_remove_completion(ReadLineState *rs, int nb_args, const char *str)qapi_free_ChardevInfoList (start); } +static void ringbuf_completion (ReadLineState *rs,const char *str) +{ +size_t len; +ChardevInfoList *list, *start; + + len =strlen (str); +readline_set_completion_index (rs, len); + + start = list =qmp_query_chardev (NULL ); +while (list) { +ChardevInfo *chr_info = list->value; + +if (!strncmp (chr_info->label, str, len)) { +CharDriverState *chr =qemu_chr_find (chr_info->label); +if (chr &&chr_is_ringbuf (chr)) { +readline_add_completion (rs, chr_info->label); + } + } + list = list->next; + } +qapi_free_ChardevInfoList (start); +} + +void ringbuf_read_completion (ReadLineState *rs,int nb_args,const char *str) +{ +if (nb_args !=2 ) { +return ; + } +ringbuf_completion (rs, str); +} + +void ringbuf_write_completion (ReadLineState *rs,int nb_args,const char *str) +{ +if (nb_args !=2 ) { +return ; + } +ringbuf_completion (rs, str); +} +void device_del_completion (ReadLineState *rs,int nb_args,const char *str) {size_t len;
qemu-char.c +1 -1
@@ -2849,7 +2849,7 @@ fail:return NULL ; } -static bool chr_is_ringbuf (const CharDriverState *chr) +bool chr_is_ringbuf (const CharDriverState *chr) {return chr->chr_write == ringbuf_chr_write; }
Signature · 1 line
1.8.3.2
PATCH 2/7 monitor: Add watchdog_action argument completion.
In reply to Hani Benhabiles--- hmp-commands.hx | 1 + hmp.h | 2 ++ monitor.c | 14 ++++++++++++++ 3 files changed, 17 insertions(+)
hmp-commands.hx +1 -0
@@ -1359,6 +1359,7 @@ ETEXI .params = "[reset|shutdown|poweroff|pause|debug|none]", .help = "change watchdog action", .mhandler.cmd = do_watchdog_action, + .command_completion = watchdog_action_completion, }, STEXI
hmp.h +2 -0
@@ -105,5 +105,7 @@ void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str);void netdev_del_completion (ReadLineState *rs,int nb_args,const char *str);void ringbuf_write_completion (ReadLineState *rs,int nb_args,const char *str);void ringbuf_read_completion (ReadLineState *rs,int nb_args,const char *str); +void watchdog_action_completion (ReadLineState *rs,int nb_args, +const char *str);#endif
monitor.c +14 -0
@@ -4558,6 +4558,20 @@ void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str) } } +void watchdog_action_completion (ReadLineState *rs,int nb_args,const char *str) +{ +if (nb_args !=2 ) { +return ; + } +readline_set_completion_index (rs,strlen (str)); +add_completion_option (rs, str,"reset" ); +add_completion_option (rs, str,"shutdown" ); +add_completion_option (rs, str,"poweroff" ); +add_completion_option (rs, str,"pause" ); +add_completion_option (rs, str,"debug" ); +add_completion_option (rs, str,"none" ); +} + static void monitor_find_completion_by_table(Monitor *mon, const mon_cmd_t *cmd_table, char **args,
Signature · 1 line
1.8.3.2
PATCH 3/7 monitor: Add migrate_set_capability completion.
In reply to Hani Benhabiles--- hmp-commands.hx | 1 + hmp.h | 2 ++ monitor.c | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+)
hmp-commands.hx +1 -0
@@ -975,6 +975,7 @@ ETEXI .params = "capability state", .help = "Enable/Disable the usage of a capability for migration", .mhandler.cmd = hmp_migrate_set_capability, + .command_completion = migrate_set_capability_completion, }, STEXI
hmp.h +2 -0
@@ -107,5 +107,7 @@ void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str);void ringbuf_read_completion (ReadLineState *rs,int nb_args,const char *str);void watchdog_action_completion (ReadLineState *rs,int nb_args,const char *str); +void migrate_set_capability_completion (ReadLineState *rs,int nb_args, +const char *str);#endif
monitor.c +21 -0
@@ -4572,6 +4572,27 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)add_completion_option (rs, str,"none" ); } +void migrate_set_capability_completion (ReadLineState *rs,int nb_args, +const char *str) +{ +size_t len; + + len =strlen (str); +readline_set_completion_index (rs, len); +if (nb_args ==2 ) { +int i; +for (i =0 ; i <MIGRATION_CAPABILITY_MAX ; i++) { +const char *name = MigrationCapability_lookup[i]; +if (!strncmp (str, name, len)) { +readline_add_completion (rs, name); + } + } + }else if (nb_args ==3 ) { +add_completion_option (rs, str,"on" ); +add_completion_option (rs, str,"off" ); + } +} + static void monitor_find_completion_by_table(Monitor *mon, const mon_cmd_t *cmd_table, char **args,
Signature · 1 line
1.8.3.2
Re: [Qemu-devel] [PATCH 3/7] monitor: Add migrate_set_capability completion.
Quoted 24 lines · * Hani Benhabiles ([email protected]) wrote:
Signed-off-by Hani Benhabiles <[email protected]>--- hmp-commands.hx | 1 + hmp.h | 2 ++ monitor.c | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+)hmp-commands.hx +1
-0@@ -975,6 +975,7 @@ ETEXI .params = "capability state", .help = "Enable/Disable the usage of a capability for migration", .mhandler.cmd = hmp_migrate_set_capability, + .command_completion = migrate_set_capability_completion, }, STEXIhmp.h +0
-0
hmp.h void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str); · line 111
Quoted 5 lines
hmp.h +2
-0@@ -107,5 +107,7 @@ void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str);void ringbuf_read_completion (ReadLineState *rs,int nb_args,const char *str);void watchdog_action_completion (ReadLineState *rs,int nb_args,const char *str); +void migrate_set_capability_completion (ReadLineState *rs,int nb_args, +const char *str);
Thank you for doing this; I spend way too much time typing these commands.
Quoted 18 lines
hmp.h +0
-0#endif monitor.c +9
-0@@ -4572,6 +4572,27 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)add_completion_option (rs, str,"none" ); } +void migrate_set_capability_completion (ReadLineState *rs,int nb_args, +const char *str) +{ +size_t len; + + len =strlen (str); +readline_set_completion_index (rs, len); +if (nb_args ==2 ) { +int i;
monitor.c void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str) · line 4593
Quoted 10 lines
monitor.c +10
-0+for (i =0 ; i <MIGRATION_CAPABILITY_MAX ; i++) { +const char *name = MigrationCapability_lookup[i]; +if (!strncmp (str, name, len)) { +readline_add_completion (rs, name); + } + } + }else if (nb_args ==3 ) { +add_completion_option (rs, str,"on" ); +add_completion_option (rs, str,"off" ); + }
It's a shame you have to do all of these manually; if we could tell something that we had an enum of 'MigrationCapability' then it could remove the command specific glue.
Dave
Quoted 9 lines
monitor.c +2
-0+} + static void monitor_find_completion_by_table(Monitor *mon, const mon_cmd_t *cmd_table, char **args,Signature · 1 line
1.8.3.2
--
Dr. David Alan Gilbert / [email protected] / Manchester, UK
Re: [Qemu-devel] [PATCH 3/7] monitor: Add migrate_set_capability completion.
Quoted 57 lines · Dr. David Alan Gilbert
Quoted 24 lines · * Hani Benhabiles ([email protected]) wrote:
Signed-off-by Hani Benhabiles <[email protected]>--- hmp-commands.hx | 1 + hmp.h | 2 ++ monitor.c | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+)hmp-commands.hx +1
-0@@ -975,6 +975,7 @@ ETEXI .params = "capability state", .help = "Enable/Disable the usage of a capability for migration", .mhandler.cmd = hmp_migrate_set_capability, + .command_completion = migrate_set_capability_completion, }, STEXIhmp.h +0
-0hmp.h void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str); · line 111
Quoted 5 lines
hmp.h +2
-0@@ -107,5 +107,7 @@ void ringbuf_write_completion(ReadLineState *rs, int nb_args, const char *str);void ringbuf_read_completion (ReadLineState *rs,int nb_args,const char *str);void watchdog_action_completion (ReadLineState *rs,int nb_args,const char *str); +void migrate_set_capability_completion (ReadLineState *rs,int nb_args, +const char *str);Thank you for doing this; I spend way too much time typing these commands.
Quoted 24 lines
hmp.h +0
-0#endif monitor.c +15
-0@@ -4572,6 +4572,27 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)add_completion_option (rs, str,"none" ); } +void migrate_set_capability_completion (ReadLineState *rs,int nb_args, +const char *str) +{ +size_t len; + + len =strlen (str); +readline_set_completion_index (rs, len); +if (nb_args ==2 ) { +int i; +for (i =0 ; i <MIGRATION_CAPABILITY_MAX ; i++) { +const char *name = MigrationCapability_lookup[i]; +if (!strncmp (str, name, len)) { +readline_add_completion (rs, name); + } + }
Quoted 8 lines
monitor.c void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str) · line 4593
Quoted 4 lines
monitor.c +4
-0+ }else if (nb_args ==3 ) { +add_completion_option (rs, str,"on" ); +add_completion_option (rs, str,"off" ); + }It's a shame you have to do all of these manually; if we could tell something that we had an enum of 'MigrationCapability' then it could remove the command specific glue.
HMP command arguments are specified by an args_type string, which can't express "enumeration", so we use strings instead.
We could hack in another arguments type 'E', abusing the parameter name like type 'O'. But I think the args_type string is long past its "best before" date.
We could replace it by a command schema, like QMP's. Differences to QMP
include: arguments are positional, fewer types are accepted, and there's convenience syntax such as size suffixes.
Not exactly an easy task, I'm afraid.
[...]
PATCH 4/7 monitor: Add host_net_add device argument completion.
In reply to Hani BenhabilesAlso fix the parameters documentation.
--- hmp-commands.hx | 3 ++- hmp.h | 1 + monitor.c | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-)
hmp-commands.hx +2 -1
@@ -1209,9 +1209,10 @@ ETEXI { .name = "host_net_add", .args_type = "device:s,opts:s?", - .params = "tap|user|socket|vde|netmap|dump [options]", + .params = "tap|user|socket|vde|bridge|dump [options]", .help = "add host VLAN client", .mhandler.cmd = net_host_device_add, + .command_completion = host_net_add_completion, }, STEXI
hmp.h +1 -0
@@ -109,5 +109,6 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str);void migrate_set_capability_completion (ReadLineState *rs,int nb_args,const char *str); +void host_net_add_completion (ReadLineState *rs,int nb_args,const char *str);#endif
monitor.c +14 -0
@@ -4593,6 +4593,20 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args, } } +void host_net_add_completion (ReadLineState *rs,int nb_args,const char *str) +{ +if (nb_args !=2 ) { +return ; + } +readline_set_completion_index (rs,strlen (str)); +add_completion_option (rs, str,"tap" ); +add_completion_option (rs, str,"user" ); +add_completion_option (rs, str,"socket" ); +add_completion_option (rs, str,"vde" ); +add_completion_option (rs, str,"dump" ); +add_completion_option (rs, str,"bridge" ); +} + static void monitor_find_completion_by_table(Monitor *mon, const mon_cmd_t *cmd_table, char **args,
Signature · 1 line
1.8.3.2
Re: [Qemu-devel] [PATCH 4/7] monitor: Add host_net_add device argument completion.
hmp-commands.hx ETEXI · line 1212
Quoted 10 lines · Hani Benhabiles
hmp-commands.hx +1
-1@@ -1209,9 +1209,10 @@ ETEXI { .name = "host_net_add", .args_type = "device:s,opts:s?", - .params = "tap|user|socket|vde|netmap|dump [options]", + .params = "tap|user|socket|vde|bridge|dump [options]",
Why did you delete "netmap"? I guess "bridge" should have been appended.
Quoted 10 lines
monitor.c +2
-0@@ -4593,6 +4593,20 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args, } } +void host_net_add_completion (ReadLineState *rs,int nb_args,const char *str) +{
monitor.c void migrate_set_capability_completion(ReadLineState *rs, int nb_args, · line 4607
Quoted 10 lines
monitor.c +10
-0+if (nb_args !=2 ) { +return ; + } +readline_set_completion_index (rs,strlen (str)); +add_completion_option (rs, str,"tap" ); +add_completion_option (rs, str,"user" ); +add_completion_option (rs, str,"socket" ); +add_completion_option (rs, str,"vde" ); +add_completion_option (rs, str,"dump" ); +add_completion_option (rs, str,"bridge" );
Please take a look at net_host_check_device() and share the list from there. (Some of the netdevs depend on build-time options.)
Re: [Qemu-devel] [PATCH 4/7] monitor: Add host_net_add device argument completion.
Quoted 14 lines · Stefan Hajnoczi
hmp-commands.hx ETEXI · line 1212
Quoted 10 lines · Hani Benhabiles
hmp-commands.hx +1
-1@@ -1209,9 +1209,10 @@ ETEXI { .name = "host_net_add", .args_type = "device:s,opts:s?", - .params = "tap|user|socket|vde|netmap|dump [options]", + .params = "tap|user|socket|vde|bridge|dump [options]",Why did you delete "netmap"? I guess "bridge" should have been appended.
Because "netmap" fails the net_host_check_device() check:
(qemu) host_net_add user
(qemu) host_net_add foooo
invalid host network device foooo
(qemu) host_net_add netmap
invalid host network device netmap
Should "netmap" be added there ?
Quoted 8 lines
Quoted 8 lines
monitor.c +0
-0@@ -4593,6 +4593,20 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args, } }
Quoted 15 lines
monitor.c void migrate_set_capability_completion(ReadLineState *rs, int nb_args, · line 4607
Quoted 12 lines
monitor.c +12
-0+void host_net_add_completion (ReadLineState *rs,int nb_args,const char *str) +{ +if (nb_args !=2 ) { +return ; + } +readline_set_completion_index (rs,strlen (str)); +add_completion_option (rs, str,"tap" ); +add_completion_option (rs, str,"user" ); +add_completion_option (rs, str,"socket" ); +add_completion_option (rs, str,"vde" ); +add_completion_option (rs, str,"dump" ); +add_completion_option (rs, str,"bridge" );Please take a look at
net_host_check_device()and share the list from there. (Some of the netdevs depend on build-time options.)
Ok, will add a patch to share the valid_params_list[] in include/net/net.h.
Re: [Qemu-devel] [PATCH 4/7] monitor: Add host_net_add device argument completion.
Quoted 18 lines · Hani Benhabiles
Quoted 14 lines · Stefan Hajnoczi
hmp-commands.hx ETEXI · line 1212
Quoted 10 lines · Hani Benhabiles
hmp-commands.hx +1
-1@@ -1209,9 +1209,10 @@ ETEXI { .name = "host_net_add", .args_type = "device:s,opts:s?", - .params = "tap|user|socket|vde|netmap|dump [options]", + .params = "tap|user|socket|vde|bridge|dump [options]",Why did you delete "netmap"? I guess "bridge" should have been appended.
Because "netmap" fails the
net_host_check_device()check:
Quoted 7 lines
(qemu)
host_net_adduser
(qemu)host_net_addfoooo
invalid host network device foooo
(qemu)host_net_addnetmap
invalid host network device netmapShould "netmap" be added there ?
Probably because your QEMU was not built with (optional) netmap support. It's primarily used on FreeBSD but there is Linux code as well:
https://code.google.com/p/netmap/
Stefan
PATCH 5/7 readline: Make completion strings always unique.
In reply to Hani BenhabilesThere is no need to clutter the user's choices with repeating the same value multiple times.
--- util/readline.c | 6 ++++++ 1 file changed, 6 insertions(+)
util/readline.c +6 -0
@@ -263,6 +263,12 @@ static void readline_hist_add(ReadLineState *rs, const char *cmdline)void readline_add_completion (ReadLineState *rs,const char *str) {if (rs->nb_completions <READLINE_MAX_COMPLETIONS ) { +int i; +for (i =0 ; i < rs->nb_completions; i++) { +if (!strcmp (rs->completions[i], str)) { +return ; + } + } rs->completions[rs->nb_completions++] =g_strdup (str); } }
Signature · 1 line
1.8.3.2
PATCH 6/7 monitor: Add host_net_remove arguments completion.
In reply to Hani BenhabilesRelies on readline unique completion strings patch to make the added vlan/hub completion values unique, instead of using something like a hash table.
--- hmp-commands.hx | 1 + hmp.h | 2 ++ monitor.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+)
hmp-commands.hx +1 -0
@@ -1227,6 +1227,7 @@ ETEXI .params = "vlan_id name", .help = "remove host VLAN client", .mhandler.cmd = net_host_device_remove, + .command_completion = host_net_remove_completion, }, STEXI
hmp.h +2 -0
@@ -110,5 +110,7 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args,void migrate_set_capability_completion (ReadLineState *rs,int nb_args,const char *str);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);#endif
monitor.c +38 -0
@@ -4607,6 +4607,44 @@ void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str)add_completion_option (rs, str,"bridge" ); } +void host_net_remove_completion (ReadLineState *rs,int nb_args,const char *str) +{ +NetClientState *ncs[255 ]; +int count, i, len; + + len =strlen (str); +readline_set_completion_index (rs, len); +if (nb_args ==2 ) { + count =qemu_find_net_clients_except (NULL , ncs, +NET_CLIENT_OPTIONS_KIND_NONE ,255 ); +for (i =0 ; i < count; i++) { +int id; +char name[16 ]; + +if (net_hub_id_for_client (ncs[i], &id)) { +continue ; + } +snprintf (name,sizeof (name),"%d" , id); +if (!strncmp (str, name, len)) { +readline_add_completion (rs, name); + } + } +return ; + }else if (nb_args ==3 ) { + count =qemu_find_net_clients_except (NULL , ncs, +NET_CLIENT_OPTIONS_KIND_NIC ,255 ); +for (i =0 ; i < count; i++) { +const char *name; + + name = ncs[i]->name; +if (!strncmp (str, name, len)) { +readline_add_completion (rs, name); + } + } +return ; + } +} + static void monitor_find_completion_by_table(Monitor *mon, const mon_cmd_t *cmd_table, char **args,
Signature · 1 line
1.8.3.2
Re: [Qemu-devel] [PATCH 6/7] monitor: Add host_net_remove arguments completion.
Quoted 9 lines · Hani Benhabiles
Relies on readline unique completion strings patch to make the added vlan/hub completion values unique, instead of using something like a hash table.
Signed-off-by Hani Benhabiles <[email protected]>--- hmp-commands.hx | 1 + hmp.h | 2 ++ monitor.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+)
PATCH 7/7 monitor: Add delvm and loadvm argument completion.
In reply to Hani Benhabiles--- hmp-commands.hx | 2 ++ hmp.h | 2 ++ monitor.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+)
hmp-commands.hx +2 -0
@@ -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
hmp.h +2 -0
@@ -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
monitor.c +48 -0
60 lines not on this page · raw message
Signature · 1 line
1.8.3.2