aboutsummaryrefslogtreecommitdiff
path: root/monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'monitor.c')
-rw-r--r--monitor.c48
1 files changed, 43 insertions, 5 deletions
diff --git a/monitor.c b/monitor.c
index 105a49a73a..88390ff078 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2508,6 +2508,33 @@ static const char *get_command_name(const char *cmdline,
return p;
}
+/**
+ * Read key of 'type' into 'key' and return the current
+ * 'type' pointer.
+ */
+static char *key_get_info(const char *type, char **key)
+{
+ size_t len;
+ char *p, *str;
+
+ if (*type == ',')
+ type++;
+
+ p = strchr(type, ':');
+ if (!p) {
+ *key = NULL;
+ return NULL;
+ }
+ len = p - type;
+
+ str = qemu_malloc(len + 1);
+ memcpy(str, type, len);
+ str[len] = '\0';
+
+ *key = str;
+ return ++p;
+}
+
static int default_fmt_format = 'x';
static int default_fmt_size = 4;
@@ -2520,6 +2547,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
const mon_cmd_t *cmd;
char cmdname[256];
char buf[1024];
+ char *key;
void *str_allocated[MAX_ARGS];
void *args[MAX_ARGS];
void (*handler_0)(Monitor *mon);
@@ -2571,9 +2599,10 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
typestr = cmd->args_type;
nb_args = 0;
for(;;) {
- c = *typestr;
- if (c == '\0')
+ typestr = key_get_info(typestr, &key);
+ if (!typestr)
break;
+ c = *typestr;
typestr++;
switch(c) {
case 'F':
@@ -2787,6 +2816,8 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c);
goto fail;
}
+ qemu_free(key);
+ key = NULL;
}
/* check that all arguments were parsed */
while (qemu_isspace(*p))
@@ -2854,6 +2885,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
qemu_errors_to_previous();
fail:
+ qemu_free(key);
for(i = 0; i < MAX_ARGS; i++)
qemu_free(str_allocated[i]);
}
@@ -2972,6 +3004,12 @@ static void parse_cmdline(const char *cmdline,
*pnb_args = nb_args;
}
+static const char *next_arg_type(const char *typestr)
+{
+ const char *p = strchr(typestr, ':');
+ return (p != NULL ? ++p : typestr);
+}
+
static void monitor_find_completion(const char *cmdline)
{
const char *cmdname;
@@ -3014,12 +3052,12 @@ static void monitor_find_completion(const char *cmdline)
}
return;
found:
- ptype = cmd->args_type;
+ ptype = next_arg_type(cmd->args_type);
for(i = 0; i < nb_args - 2; i++) {
if (*ptype != '\0') {
- ptype++;
+ ptype = next_arg_type(ptype);
while (*ptype == '?')
- ptype++;
+ ptype = next_arg_type(ptype);
}
}
str = args[nb_args - 1];