monitor: allow register hmp commands
Allow commands having a NULL cmd pointer, add a function to set the pointer later. Use case: allow modules implement hmp commands. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Jose R. Ziviani <jziviani@suse.de> Message-Id: <20210624103836.2382472-31-kraxel@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
dae0ec159f
commit
f0e48cbd79
|
@ -51,4 +51,7 @@ int monitor_fdset_dup_fd_add(int64_t fdset_id, int flags);
|
||||||
void monitor_fdset_dup_fd_remove(int dup_fd);
|
void monitor_fdset_dup_fd_remove(int dup_fd);
|
||||||
int64_t monitor_fdset_dup_fd_find(int dup_fd);
|
int64_t monitor_fdset_dup_fd_find(int dup_fd);
|
||||||
|
|
||||||
|
void monitor_register_hmp(const char *name, bool info,
|
||||||
|
void (*cmd)(Monitor *mon, const QDict *qdict));
|
||||||
|
|
||||||
#endif /* MONITOR_H */
|
#endif /* MONITOR_H */
|
||||||
|
|
|
@ -1089,6 +1089,13 @@ void handle_hmp_command(MonitorHMP *mon, const char *cmdline)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!cmd->cmd) {
|
||||||
|
/* FIXME: is it useful to try autoload modules here ??? */
|
||||||
|
monitor_printf(&mon->common, "Command \"%.*s\" is not available.\n",
|
||||||
|
(int)(cmdline - cmd_start), cmd_start);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
qdict = monitor_parse_arguments(&mon->common, &cmdline, cmd);
|
qdict = monitor_parse_arguments(&mon->common, &cmdline, cmd);
|
||||||
if (!qdict) {
|
if (!qdict) {
|
||||||
while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
|
while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
|
||||||
|
|
|
@ -1974,6 +1974,22 @@ static void sortcmdlist(void)
|
||||||
compare_mon_cmd);
|
compare_mon_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void monitor_register_hmp(const char *name, bool info,
|
||||||
|
void (*cmd)(Monitor *mon, const QDict *qdict))
|
||||||
|
{
|
||||||
|
HMPCommand *table = info ? hmp_info_cmds : hmp_cmds;
|
||||||
|
|
||||||
|
while (table->name != NULL) {
|
||||||
|
if (strcmp(table->name, name) == 0) {
|
||||||
|
g_assert(table->cmd == NULL);
|
||||||
|
table->cmd = cmd;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
table++;
|
||||||
|
}
|
||||||
|
g_assert_not_reached();
|
||||||
|
}
|
||||||
|
|
||||||
void monitor_init_globals(void)
|
void monitor_init_globals(void)
|
||||||
{
|
{
|
||||||
monitor_init_globals_core();
|
monitor_init_globals_core();
|
||||||
|
|
Loading…
Reference in New Issue