[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/24] monitor: add !qmp pre-conditions
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 14/24] monitor: add !qmp pre-conditions |
Date: |
Mon, 10 Oct 2016 13:22:51 +0400 |
It's not always obvious whether a function is meant to be used only with
HMP or QMP. Add a few pre-conditions to document this aspect and
eventually catch run-time bugs.
Signed-off-by: Marc-André Lureau <address@hidden>
---
monitor.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 45 insertions(+), 2 deletions(-)
diff --git a/monitor.c b/monitor.c
index 4a20d81..61abb86 100644
--- a/monitor.c
+++ b/monitor.c
@@ -255,6 +255,8 @@ bool monitor_cur_is_qmp(void)
void monitor_read_command(Monitor *mon, int show_prompt)
{
+ assert(!monitor_is_qmp(mon));
+
if (!mon->rs)
return;
@@ -266,6 +268,8 @@ void monitor_read_command(Monitor *mon, int show_prompt)
int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
void *opaque)
{
+ assert(!monitor_is_qmp(mon));
+
if (mon->rs) {
readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
/* prompt is printed on return from the command handler */
@@ -2558,6 +2562,8 @@ static const mon_cmd_t *monitor_parse_command(Monitor
*mon,
const mon_cmd_t *cmd;
char cmdname[256];
+ assert(!monitor_is_qmp(mon));
+
/* extract the command name */
p = get_command_name(*cmdp, cmdname, sizeof(cmdname));
if (!p)
@@ -2602,6 +2608,8 @@ static QDict *monitor_parse_arguments(Monitor *mon,
char buf[1024];
QDict *qdict = qdict_new();
+ assert(!monitor_is_qmp(mon));
+
/* parse the parameters */
typestr = cmd->args_type;
for(;;) {
@@ -2981,6 +2989,8 @@ static void cmd_completion(Monitor *mon, const char
*name, const char *list)
char cmd[128];
int len;
+ assert(!monitor_is_qmp(mon));
+
p = list;
for(;;) {
pstart = p;
@@ -3010,6 +3020,8 @@ static void file_completion(Monitor *mon, const char
*input)
int input_path_len;
const char *p;
+ assert(!monitor_is_qmp(mon));
+
p = strrchr(input, '/');
if (!p) {
input_path_len = 0;
@@ -3560,6 +3572,8 @@ static void monitor_find_completion_by_table(Monitor *mon,
const mon_cmd_t *cmd;
BlockBackend *blk = NULL;
+ assert(!monitor_is_qmp(mon));
+
if (nb_args <= 1) {
/* command completion */
if (nb_args == 0)
@@ -3641,6 +3655,8 @@ static void monitor_find_completion(void *opaque,
char *args[MAX_ARGS];
int nb_args, len;
+ assert(!monitor_is_qmp(mon));
+
/* 1. parse the cmdline */
if (parse_cmdline(cmdline, &nb_args, args) < 0) {
return;
@@ -3809,6 +3825,8 @@ static void monitor_qmp_read(void *opaque, const uint8_t
*buf, int size)
cur_mon = opaque;
+ assert(monitor_is_qmp(cur_mon));
+
json_message_parser_feed(&cur_mon->qmp.parser, (const char *) buf, size);
cur_mon = old_mon;
@@ -3820,6 +3838,7 @@ static void monitor_read(void *opaque, const uint8_t
*buf, int size)
int i;
cur_mon = opaque;
+ assert(monitor_is_qmp(cur_mon));
if (cur_mon->rs) {
for (i = 0; i < size; i++)
@@ -3839,6 +3858,8 @@ static void monitor_command_cb(void *opaque, const char
*cmdline,
{
Monitor *mon = opaque;
+ assert(!monitor_is_qmp(mon));
+
monitor_suspend(mon);
handle_hmp_command(mon, cmdline);
monitor_resume(mon);
@@ -3846,6 +3867,8 @@ static void monitor_command_cb(void *opaque, const char
*cmdline,
int monitor_suspend(Monitor *mon)
{
+ assert(!monitor_is_qmp(mon));
+
if (!mon->rs)
return -ENOTTY;
mon->suspend_cnt++;
@@ -3854,6 +3877,8 @@ int monitor_suspend(Monitor *mon)
void monitor_resume(Monitor *mon)
{
+ assert(!monitor_is_qmp(mon));
+
if (!mon->rs)
return;
if (--mon->suspend_cnt == 0)
@@ -3875,6 +3900,8 @@ static void monitor_qmp_event(void *opaque, int event)
QObject *data;
Monitor *mon = opaque;
+ assert(monitor_is_qmp(mon));
+
switch (event) {
case CHR_EVENT_OPENED:
mon->qmp.in_command_mode = false;
@@ -3898,6 +3925,8 @@ static void monitor_event(void *opaque, int event)
{
Monitor *mon = opaque;
+ assert(!monitor_is_qmp(mon));
+
switch (event) {
case CHR_EVENT_MUX_IN:
qemu_mutex_lock(&mon->out_lock);
@@ -3970,15 +3999,23 @@ static void sortcmdlist(void)
static void GCC_FMT_ATTR(2, 3) monitor_readline_printf(void *opaque,
const char *fmt, ...)
{
+ Monitor *mon = opaque;
va_list ap;
+
+ assert(!monitor_is_qmp(mon));
+
va_start(ap, fmt);
- monitor_vprintf(opaque, fmt, ap);
+ monitor_vprintf(mon, fmt, ap);
va_end(ap);
}
static void monitor_readline_flush(void *opaque)
{
- monitor_flush(opaque);
+ Monitor *mon = opaque;
+
+ assert(!monitor_is_qmp(mon));
+
+ monitor_flush(mon);
}
static void __attribute__((constructor)) monitor_lock_init(void)
@@ -4047,6 +4084,8 @@ static void bdrv_password_cb(void *opaque, const char
*password,
int ret = 0;
Error *local_err = NULL;
+ assert(!monitor_is_qmp(mon));
+
bdrv_add_key(bs, password, &local_err);
if (local_err) {
error_report_err(local_err);
@@ -4064,6 +4103,8 @@ int monitor_read_bdrv_key_start(Monitor *mon,
BlockDriverState *bs,
{
int err;
+ assert(!monitor_is_qmp(mon));
+
monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs),
bdrv_get_encrypted_filename(bs));
@@ -4085,6 +4126,8 @@ int monitor_read_block_device_key(Monitor *mon, const
char *device,
Error *err = NULL;
BlockBackend *blk;
+ assert(!monitor_is_qmp(mon));
+
blk = blk_by_name(device);
if (!blk) {
monitor_printf(mon, "Device not found %s\n", device);
--
2.10.0
- [Qemu-devel] [PATCH 04/24] qmp: use a return callback for the command reply, (continued)
- [Qemu-devel] [PATCH 04/24] qmp: use a return callback for the command reply, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 05/24] qmp: add QmpClient, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 06/24] qmp: add qmp_return_is_cancelled(), Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 07/24] qmp: introduce async command type, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 08/24] qapi: ignore top-level 'id' field, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 10/24] qmp: check that async command have an 'id', Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 09/24] qmp: take 'id' from request, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 11/24] scripts: learn 'async' qapi commands, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 12/24] tests: add dispatch async tests, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 13/24] monitor: add 'async' capability, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 14/24] monitor: add !qmp pre-conditions,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 15/24] monitor: suspend when running async and client has no async, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 16/24] qmp: update qmp-spec about async capability, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 17/24] qtest: add qtest-timeout, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 19/24] tests: add tests for async and non-async clients, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 18/24] qtest: add qtest_init_qmp_caps(), Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 20/24] qapi: improve 'screendump' documentation, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 21/24] console: graphic_hw_update return true if async, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 22/24] console: add graphic_hw_update_done(), Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 23/24] console: make screendump async, Marc-André Lureau, 2016/10/10
- [Qemu-devel] [PATCH 24/24] qmp: move json-message-parser to QmpClient, Marc-André Lureau, 2016/10/10