diff options
author | Luiz Capitulino <lcapitulino@redhat.com> | 2010-06-22 19:10:46 -0300 |
---|---|---|
committer | Luiz Capitulino <lcapitulino@redhat.com> | 2010-07-01 14:27:13 -0300 |
commit | 5af7bbae0ca45962d0bcd19753a947aabee6f7f1 (patch) | |
tree | c51ec4bcc03eac4b6409b9d9ae0006dd4f3b4351 | |
parent | 410cbafebc7168a278a23c856b4f5ff276ef1c85 (diff) | |
download | qemu-5af7bbae0ca45962d0bcd19753a947aabee6f7f1.zip qemu-5af7bbae0ca45962d0bcd19753a947aabee6f7f1.tar.gz qemu-5af7bbae0ca45962d0bcd19753a947aabee6f7f1.tar.bz2 |
QMP: Fix error reporting in the async API
The current asynchronous command API doesn't return a QMP response
when the async command fails.
This is easy to reproduce with the balloon command (the sole async
command we have so far): run qemu w/o the '-balloon virtio' option
and try to issue the balloon command via QMP: no response will be
sent to the client.
This commit fixes the problem by making qmp_async_cmd_handler()
return the handler's error code and then calling
monitor_protocol_emitter() if the handler has returned an error.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
-rw-r--r-- | monitor.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -546,10 +546,10 @@ static void qmp_monitor_complete(void *opaque, QObject *ret_data) monitor_protocol_emitter(opaque, ret_data); } -static void qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd, - const QDict *params) +static int qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd, + const QDict *params) { - cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon); + return cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon); } static void qmp_async_info_handler(Monitor *mon, const mon_cmd_t *cmd) @@ -4239,7 +4239,11 @@ static void handle_qmp_command(JSONMessageParser *parser, QList *tokens) } if (monitor_handler_is_async(cmd)) { - qmp_async_cmd_handler(mon, cmd, args); + err = qmp_async_cmd_handler(mon, cmd, args); + if (err) { + /* emit the error response */ + goto err_out; + } } else { monitor_call_handler(mon, cmd, args); } |