On Wed, 12 Sep 2012 19:57:26 +0800 Lei Li <li...@linux.vnet.ibm.com> wrote:
> 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); You should print the error to the user. > + 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; > + } Don't both commands (memchr_read/write) already do this? Why don't you just pass 'device' to them and let them fail if it doesn't exist? > + > + 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; > + } That check doesn't make sense. > + > + 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); >