Signed-off-by: Lei Li <li...@linux.vnet.ibm.com> --- hmp.c | 42 ++++++++++++++++++++++++++++++++++++++++++ monitor.c | 18 ++++++++++++++++++ monitor.h | 2 ++ 3 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/hmp.c b/hmp.c index 4397981..a016a5c 100644 --- a/hmp.c +++ b/hmp.c @@ -1205,3 +1205,45 @@ void hmp_screen_dump(Monitor *mon, const QDict *qdict) qmp_screendump(filename, &err); hmp_handle_error(mon, &err); } + +int console_escape_char = 0x1d; /* ctrl-] is used for escape */ + +static void hmp_read_console(Monitor *mon, const char *data, + void *opaque) +{ + CharDriverState *chr = opaque; + uint32_t size = strlen(data); + enum DataFormat format = DATA_FORMAT_UTF8; + enum CongestionControl control = CONGESTION_CONTROL_DROP; + + Error *err = NULL; + + if (*data == console_escape_char) { + monitor_resume(mon); + return; + } + + qmp_memchar_write(chr->label, size, data, 0, format, + 0, control, &err); + monitor_read_command(mon, 1); +} + +void hmp_console(Monitor *mon, const QDict *qdict) +{ + const char *device = qdict_get_str(qdict, "chardev"); + CharDriverState *chr; + Error *err = NULL; + + chr = qemu_chr_find(device); + + if (!chr) { + error_set(&err, QERR_DEVICE_NOT_FOUND, device); + hmp_handle_error(mon, &err); + return; + } + + if (monitor_read_console(mon, device, hmp_read_console, chr) < 0) { + monitor_printf(mon, "Connect to console %s failed\n", device); + } + g_free(chr); +} diff --git a/monitor.c b/monitor.c index 67064e2..285dc7b 100644 --- a/monitor.c +++ b/monitor.c @@ -256,6 +256,24 @@ int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func, } } +int monitor_read_console(Monitor *mon, const char *device, + ReadLineFunc *readline_func, void *opaque) +{ + char prompt[60]; + + if (!mon->rs) + return -1; + + if (monitor_ctrl_mode(mon)) { + qerror_report(QERR_MISSING_PARAMETER, "console"); + return -EINVAL; + } + + snprintf(prompt, sizeof(prompt), "%s: ", device); + readline_start(mon->rs, prompt, 0, readline_func, opaque); + return 0; +} + void monitor_flush(Monitor *mon) { if (mon && mon->outbuf_index != 0 && !mon->mux_out) { diff --git a/monitor.h b/monitor.h index 64c1561..924a042 100644 --- a/monitor.h +++ b/monitor.h @@ -84,6 +84,8 @@ void monitor_read_command(Monitor *mon, int show_prompt); ReadLineState *monitor_get_rs(Monitor *mon); int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func, void *opaque); +int monitor_read_console(Monitor *mon, const char *device, + ReadLineFunc *readline_func, void *opaque); int qmp_qom_set(Monitor *mon, const QDict *qdict, QObject **ret); -- 1.7.7.6