diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-04-27 17:28:41 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-04-27 17:28:41 +0100 |
commit | 0d81cdddaa40a1988b24657aeac19959cfad0fde (patch) | |
tree | 2c41f3347b5cfac69d1cf8c5d2ce7f161a4d225e /monitor.c | |
parent | e1a5476354d396773e4c555f126d752d4ae58fa9 (diff) | |
parent | 2d5a8346a484250934526a15b3a522bdba7e6772 (diff) |
Merge remote-tracking branch 'remotes/qmp-unstable/tags/for-upstream' into staging
Four little fixes
# gpg: Signature made Fri Apr 24 19:56:51 2015 BST using RSA key ID E24ED5A7
# gpg: Good signature from "Luiz Capitulino <lcapitulino@gmail.com>"
* remotes/qmp-unstable/tags/for-upstream:
qmp: Give saner messages related to qmp_capabilities misuse
qmp-commands: fix incorrect uses of ":O" specifier
qapi: Drop dead genlist parameter
balloon: improve error msg when adding second device
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'monitor.c')
-rw-r--r-- | monitor.c | 23 |
1 files changed, 19 insertions, 4 deletions
@@ -4783,10 +4783,22 @@ static int monitor_can_read(void *opaque) return (mon->suspend_cnt == 0) ? 1 : 0; } -static int invalid_qmp_mode(const Monitor *mon, const mon_cmd_t *cmd) +static bool invalid_qmp_mode(const Monitor *mon, const mon_cmd_t *cmd) { - int is_cap = cmd->mhandler.cmd_new == do_qmp_capabilities; - return (qmp_cmd_mode(mon) ? is_cap : !is_cap); + bool is_cap = cmd->mhandler.cmd_new == do_qmp_capabilities; + if (is_cap && qmp_cmd_mode(mon)) { + qerror_report(ERROR_CLASS_COMMAND_NOT_FOUND, + "Capabilities negotiation is already complete, command " + "'%s' ignored", cmd->name); + return true; + } + if (!is_cap && !qmp_cmd_mode(mon)) { + qerror_report(ERROR_CLASS_COMMAND_NOT_FOUND, + "Expecting capabilities negotiation with " + "'qmp_capabilities' before command '%s'", cmd->name); + return true; + } + return false; } /* @@ -5080,11 +5092,14 @@ static void handle_qmp_command(JSONMessageParser *parser, QList *tokens) cmd_name = qdict_get_str(input, "execute"); trace_handle_qmp_command(mon, cmd_name); cmd = qmp_find_cmd(cmd_name); - if (!cmd || invalid_qmp_mode(mon, cmd)) { + if (!cmd) { qerror_report(ERROR_CLASS_COMMAND_NOT_FOUND, "The command %s has not been found", cmd_name); goto err_out; } + if (invalid_qmp_mode(mon, cmd)) { + goto err_out; + } obj = qdict_get(input, "arguments"); if (!obj) { |