diff options
-rw-r--r-- | Makefile.android | 2 | ||||
-rw-r--r-- | monitor.c | 49 | ||||
-rw-r--r-- | monitor.h | 44 |
3 files changed, 87 insertions, 8 deletions
diff --git a/Makefile.android b/Makefile.android index a7006b8..4e796d9 100644 --- a/Makefile.android +++ b/Makefile.android @@ -634,6 +634,8 @@ CORE_MISC_SOURCES = vl-android.c \ monitor.c \ readline.c \ qemu-char-android.c \ + qemu-error.c \ + qerror.c \ disas.c \ arm-dis.c \ aes.c \ @@ -96,6 +96,24 @@ Monitor *cur_mon = NULL; static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque); +static inline int qmp_cmd_mode(const Monitor *mon) +{ + //return (mon->mc ? mon->mc->command_mode : 0); + return 0; +} + +/* Return true if in control mode, false otherwise */ +static inline int monitor_ctrl_mode(const Monitor *mon) +{ + return (mon->flags & MONITOR_USE_CONTROL); +} + +/* Return non-zero iff we have a current monitor, and it is in QMP mode. */ +int monitor_cur_is_qmp(void) +{ + return cur_mon && monitor_ctrl_mode(cur_mon); +} + static void monitor_read_command(Monitor *mon, int show_prompt) { readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL); @@ -2739,6 +2757,22 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) qemu_free(str_allocated[i]); } +void monitor_set_error(Monitor *mon, QError *qerror) +{ +#if 1 + QDECREF(qerror); +#else + /* report only the first error */ + if (!mon->error) { + mon->error = qerror; + } else { + MON_DEBUG("Additional error report at %s:%d\n", + qerror->file, qerror->linenr); + QDECREF(qerror); + } +#endif +} + static void cmd_completion(const char *name, const char *list) { const char *p, *pstart; @@ -3088,16 +3122,21 @@ static void bdrv_password_cb(Monitor *mon, const char *password, void *opaque) monitor_read_command(mon, 1); } -void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, - BlockDriverCompletionFunc *completion_cb, - void *opaque) +int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, + BlockDriverCompletionFunc *completion_cb, + void *opaque) { int err; if (!bdrv_key_required(bs)) { if (completion_cb) completion_cb(opaque, 0); - return; + return 0; + } + + if (monitor_ctrl_mode(mon)) { + qerror_report(QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs)); + return -1; } monitor_printf(mon, "%s (%s) is encrypted.\n", bdrv_get_device_name(bs), @@ -3110,4 +3149,6 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, if (err && completion_cb) completion_cb(opaque, err); + + return err; } @@ -3,23 +3,55 @@ #include "qemu-common.h" #include "qemu-char.h" +#include "qerror.h" +#include "qdict.h" #include "block.h" extern Monitor *cur_mon; +extern Monitor *default_mon; /* flags for monitor_init */ #define MONITOR_IS_DEFAULT 0x01 #define MONITOR_USE_READLINE 0x02 -#define MONITOR_QUIT_DOESNT_EXIT 0x04 /* prevent 'quit' from exiting the emulator */ +#define MONITOR_IS_DEFAULT 0x01 +#define MONITOR_USE_READLINE 0x02 +#define MONITOR_USE_CONTROL 0x04 +#define MONITOR_QUIT_DOESNT_EXIT 0x08 /* prevent 'quit' from exiting the emulator */ + +/* flags for monitor commands */ +#define MONITOR_CMD_ASYNC 0x0001 +#define MONITOR_CMD_USER_ONLY 0x0002 + +/* QMP events */ +typedef enum MonitorEvent { + QEVENT_SHUTDOWN, + QEVENT_RESET, + QEVENT_POWERDOWN, + QEVENT_STOP, + QEVENT_RESUME, + QEVENT_VNC_CONNECTED, + QEVENT_VNC_INITIALIZED, + QEVENT_VNC_DISCONNECTED, + QEVENT_BLOCK_IO_ERROR, + QEVENT_RTC_CHANGE, + QEVENT_WATCHDOG, + QEVENT_MAX, +} MonitorEvent; + +int monitor_cur_is_qmp(void); + +void monitor_protocol_event(MonitorEvent event, QObject *data); void monitor_init(CharDriverState *chr, int flags); int monitor_suspend(Monitor *mon); void monitor_resume(Monitor *mon); -void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, - BlockDriverCompletionFunc *completion_cb, - void *opaque); +int monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, + BlockDriverCompletionFunc *completion_cb, + void *opaque); + +int monitor_get_fd(Monitor *mon, const char *fdname); void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap); void monitor_printf(Monitor *mon, const char *fmt, ...) @@ -27,4 +59,8 @@ void monitor_printf(Monitor *mon, const char *fmt, ...) void monitor_print_filename(Monitor *mon, const char *filename); void monitor_flush(Monitor *mon); +typedef void (MonitorCompletion)(void *opaque, QObject *ret_data); + +void monitor_set_error(Monitor *mon, QError *qerror); + #endif /* !MONITOR_H */ |