aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Capitulino <lcapitulino@redhat.com>2009-10-07 13:41:54 -0300
committerAnthony Liguori <aliguori@us.ibm.com>2009-10-08 21:17:18 -0500
commit13917beeaca78700a737506d9e1181e83fe41d93 (patch)
treee6db16bc277b50e6850ae7e3989a5f66e01afabf
parenta2876f595bb9661806f577cc3c0f9789975b18df (diff)
monitor: Handle new and old style handlers
This commit changes monitor_handle_command() to support old style _and_ new style handlers. New style handlers are protocol independent, they return their data to the Monitor, which in turn decides how to print them (ie. user protocol vs. machine protocol). Converted handlers will use the 'user_print' member of 'mon_cmd_t' to define its user protocol function, which will be called to print data in the user protocol format. Handlers which don't have 'user_print' defined are not converted and are handled as usual. Patchworks-ID: 35340 Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--monitor.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/monitor.c b/monitor.c
index b589d9826e..d545124ea2 100644
--- a/monitor.c
+++ b/monitor.c
@@ -77,6 +77,7 @@ typedef struct mon_cmd_t {
union {
void (*info)(Monitor *mon);
void (*cmd)(Monitor *mon, const QDict *qdict);
+ void (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
} mhandler;
} mon_cmd_t;
@@ -214,6 +215,11 @@ static int monitor_fprintf(FILE *stream, const char *fmt, ...)
return 0;
}
+static inline int monitor_handler_ported(const mon_cmd_t *cmd)
+{
+ return cmd->user_print != NULL;
+}
+
static int compare_cmd(const char *name, const char *list)
{
const char *p, *pstart;
@@ -3014,12 +3020,26 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
qdict = qdict_new();
cmd = monitor_parse_command(mon, cmdline, qdict);
- if (cmd) {
- qemu_errors_to_mon(mon);
+ if (!cmd)
+ goto out;
+
+ qemu_errors_to_mon(mon);
+
+ if (monitor_handler_ported(cmd)) {
+ QObject *data = NULL;
+
+ cmd->mhandler.cmd_new(mon, qdict, &data);
+ if (data)
+ cmd->user_print(mon, data);
+
+ qobject_decref(data);
+ } else {
cmd->mhandler.cmd(mon, qdict);
- qemu_errors_to_previous();
}
+ qemu_errors_to_previous();
+
+out:
QDECREF(qdict);
}