This patch adds 'stdio' support to qapi and also switches over the stdio chardev initialization to the new qapi code path.
Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- qapi-schema.json | 14 +++++++++++++- qemu-char.c | 26 ++++++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index f873451..b0ca67d 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3146,6 +3146,17 @@ { 'type': 'ChardevMux', 'data': { 'chardev' : 'str' } } ## +# @ChardevStdio: +# +# Configuration info for stdio chardevs. +# +# @signal: Allow signals (such as SIGINT triggered by ^C) be delivered to qemu. +# +# Since: 1.5 +## +{ 'type': 'ChardevStdio', 'data': { '*signal' : 'bool' } } + +## # @ChardevBackend: # # Configuration info for the new chardev backend. @@ -3162,7 +3173,8 @@ 'null' : 'ChardevDummy', 'mux' : 'ChardevMux', 'msmouse': 'ChardevDummy', - 'braille': 'ChardevDummy' } } + 'braille': 'ChardevDummy', + 'stdio' : 'ChardevStdio' } } ## # @ChardevReturn: diff --git a/qemu-char.c b/qemu-char.c index 51a43c1..4fdf381 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -753,7 +753,7 @@ static void qemu_chr_close_stdio(struct CharDriverState *chr) fd_chr_close(chr); } -static CharDriverState *qemu_chr_open_stdio(QemuOpts *opts) +static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts) { CharDriverState *chr; @@ -776,8 +776,10 @@ static CharDriverState *qemu_chr_open_stdio(QemuOpts *opts) chr->chr_set_echo = qemu_chr_set_echo_stdio; qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr); stdio_nb_clients++; - stdio_allow_signal = qemu_opt_get_bool(opts, "signal", - display_type != DT_NOGRAPHIC); + stdio_allow_signal = display_type != DT_NOGRAPHIC; + if (opts->has_signal) { + stdio_allow_signal = opts->signal; + } qemu_chr_fe_set_echo(chr, false); return chr; @@ -1928,7 +1930,7 @@ static void win_stdio_close(CharDriverState *chr) stdio_nb_clients--; } -static CharDriverState *qemu_chr_open_win_stdio(QemuOpts *opts) +static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts) { CharDriverState *chr; WinStdioCharState *stdio; @@ -2959,6 +2961,15 @@ static void qemu_chr_parse_file_out(QemuOpts *opts, ChardevBackend *backend, backend->file->out = g_strdup(path); } +static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend, + Error **errp) +{ + backend->stdio = g_new0(ChardevStdio, 1); + backend->stdio->has_signal = true; + backend->stdio->signal = + qemu_opt_get_bool(opts, "signal", display_type != DT_NOGRAPHIC); +} + static const struct { const char *name; /* old, pre qapi */ @@ -2975,14 +2986,14 @@ static const struct { { .name = "memory", .open = qemu_chr_open_ringbuf }, { .name = "file", .kind = CHARDEV_BACKEND_KIND_FILE, .parse = qemu_chr_parse_file_out }, + { .name = "stdio", .kind = CHARDEV_BACKEND_KIND_STDIO, + .parse = qemu_chr_parse_stdio }, #ifdef _WIN32 { .name = "pipe", .open = qemu_chr_open_win_pipe }, { .name = "console", .open = qemu_chr_open_win_con }, { .name = "serial", .open = qemu_chr_open_win }, - { .name = "stdio", .open = qemu_chr_open_win_stdio }, #else { .name = "pipe", .open = qemu_chr_open_pipe }, - { .name = "stdio", .open = qemu_chr_open_stdio }, #endif #ifdef CONFIG_BRLAPI { .name = "braille", .kind = CHARDEV_BACKEND_KIND_BRAILLE }, @@ -3472,6 +3483,9 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, chr = chr_baum_init(); break; #endif + case CHARDEV_BACKEND_KIND_STDIO: + chr = qemu_chr_open_stdio(backend->stdio); + break; default: error_setg(errp, "unknown chardev backend (%d)", backend->kind); break; -- 1.7.9.7