[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 5/5] HMP: Introduce console command
From: |
Lei Li |
Subject: |
[Qemu-devel] [PATCH 5/5] HMP: Introduce console command |
Date: |
Wed, 12 Sep 2012 19:57:26 +0800 |
Signed-off-by: Lei Li <address@hidden>
---
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