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);
>  


Reply via email to