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:
Luiz Capitulino 2009-08-28 15:27:22 -03:00 committed by Anthony Liguori
parent 37b7ad484d
commit 55f81d963b

View File

@ -2590,18 +2590,18 @@ static int default_fmt_size = 4;
#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;
int c, nb_args, i, has_arg;
int c, nb_args, has_arg;
const mon_cmd_t *cmd;
char cmdname[256];
char buf[1024];
char *key;
QDict *qdict;
void *str_allocated[MAX_ARGS];
void *args[MAX_ARGS];
void (*handler_d)(Monitor *mon, const QDict *qdict);
#ifdef DEBUG
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 */
p = get_command_name(cmdline, cmdname, sizeof(cmdname));
if (!p)
return;
return NULL;
/* find the command */
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) {
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 */
typestr = cmd->args_type;
nb_args = 0;
@ -2872,31 +2867,41 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
goto fail;
}
qemu_errors_to_mon(mon);
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();
return cmd;
fail:
fail:
qemu_free(key);
for(i = 0; i < MAX_ARGS; i++)
qemu_free(str_allocated[i]);
return NULL;
}
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);
for (i = 0; i < MAX_ARGS; i++)
qemu_free(str_allocated[i]);
}
static void cmd_completion(const char *name, const char *list)