qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 5/5] HMP: Introduce console command


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH 5/5] HMP: Introduce console command
Date: Fri, 14 Sep 2012 17:15:16 +0000

On Wed, Sep 12, 2012 at 11:57 AM, 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', also 'const' if it's not changed (I didn't spot where it
would be). This is also compared against 'char', so that would be a
better choice here too. But using an enum could generate better code.

If we supported several monitor connections, each with different
escape characters, this should be put to some console data structure
instead.

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

Missing braces, please read CODING_STYLE.

> +
> +    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
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]