[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 5/5] HMP: Introduce console command
From: |
Luiz Capitulino |
Subject: |
Re: [Qemu-devel] [PATCH 5/5] HMP: Introduce console command |
Date: |
Wed, 19 Sep 2012 15:11:29 -0300 |
On Wed, 12 Sep 2012 19:57:26 +0800
Lei Li <address@hidden> wrote:
> 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);
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);
>