monitor: Split monitor_handle_command()
In order to help the integration with unit-tests and having a better design, this commit splits monitor_handle_command() into two parts. The parsing code is moved to a function called monitor_parse_command(), while allocating memory and calling the handler is still done by monitor_handle_command(). Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
37b7ad484d
commit
55f81d963b
73
monitor.c
73
monitor.c
@ -2590,18 +2590,18 @@ static int default_fmt_size = 4;
|
|||||||
|
|
||||||
#define MAX_ARGS 16
|
#define MAX_ARGS 16
|
||||||
|
|
||||||
static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
static const mon_cmd_t *monitor_parse_command(Monitor *mon,
|
||||||
|
const char *cmdline,
|
||||||
|
void *str_allocated[],
|
||||||
|
QDict *qdict)
|
||||||
{
|
{
|
||||||
const char *p, *typestr;
|
const char *p, *typestr;
|
||||||
int c, nb_args, i, has_arg;
|
int c, nb_args, has_arg;
|
||||||
const mon_cmd_t *cmd;
|
const mon_cmd_t *cmd;
|
||||||
char cmdname[256];
|
char cmdname[256];
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
char *key;
|
char *key;
|
||||||
QDict *qdict;
|
|
||||||
void *str_allocated[MAX_ARGS];
|
|
||||||
void *args[MAX_ARGS];
|
void *args[MAX_ARGS];
|
||||||
void (*handler_d)(Monitor *mon, const QDict *qdict);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
monitor_printf(mon, "command='%s'\n", cmdline);
|
monitor_printf(mon, "command='%s'\n", cmdline);
|
||||||
@ -2610,7 +2610,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
|||||||
/* extract the command name */
|
/* extract the command name */
|
||||||
p = get_command_name(cmdline, cmdname, sizeof(cmdname));
|
p = get_command_name(cmdline, cmdname, sizeof(cmdname));
|
||||||
if (!p)
|
if (!p)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
/* find the command */
|
/* find the command */
|
||||||
for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
|
for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
|
||||||
@ -2620,14 +2620,9 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
|||||||
|
|
||||||
if (cmd->name == NULL) {
|
if (cmd->name == NULL) {
|
||||||
monitor_printf(mon, "unknown command: '%s'\n", cmdname);
|
monitor_printf(mon, "unknown command: '%s'\n", cmdname);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
qdict = qdict_new();
|
|
||||||
|
|
||||||
for(i = 0; i < MAX_ARGS; i++)
|
|
||||||
str_allocated[i] = NULL;
|
|
||||||
|
|
||||||
/* parse the parameters */
|
/* parse the parameters */
|
||||||
typestr = cmd->args_type;
|
typestr = cmd->args_type;
|
||||||
nb_args = 0;
|
nb_args = 0;
|
||||||
@ -2872,31 +2867,41 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_errors_to_mon(mon);
|
return cmd;
|
||||||
switch(nb_args) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
case 7:
|
|
||||||
case 10:
|
|
||||||
handler_d = cmd->handler;
|
|
||||||
handler_d(mon, qdict);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
monitor_printf(mon, "unsupported number of arguments: %d\n", nb_args);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
qemu_errors_to_previous();
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
qemu_free(key);
|
qemu_free(key);
|
||||||
for(i = 0; i < MAX_ARGS; i++)
|
return NULL;
|
||||||
qemu_free(str_allocated[i]);
|
}
|
||||||
|
|
||||||
|
static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
QDict *qdict;
|
||||||
|
const mon_cmd_t *cmd;
|
||||||
|
void *str_allocated[MAX_ARGS];
|
||||||
|
|
||||||
|
qdict = qdict_new();
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_ARGS; i++)
|
||||||
|
str_allocated[i] = NULL;
|
||||||
|
|
||||||
|
cmd = monitor_parse_command(mon, cmdline, str_allocated, qdict);
|
||||||
|
if (cmd) {
|
||||||
|
void (*handler)(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
|
qemu_errors_to_mon(mon);
|
||||||
|
|
||||||
|
handler = cmd->handler;
|
||||||
|
handler(mon, qdict);
|
||||||
|
|
||||||
|
qemu_errors_to_previous();
|
||||||
|
}
|
||||||
|
|
||||||
QDECREF(qdict);
|
QDECREF(qdict);
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_ARGS; i++)
|
||||||
|
qemu_free(str_allocated[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmd_completion(const char *name, const char *list)
|
static void cmd_completion(const char *name, const char *list)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user