From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support.
Date: Fri, 12 Oct 2012 11:40:28 +0200 [thread overview]
Message-ID: <k58oib$n0$1@ger.gmane.org> (raw)
In-Reply-To: <1350033962-16665-8-git-send-email-kraxel@redhat.com>
Il 12/10/2012 11:26, Gerd Hoffmann ha scritto:
> This patch adds chardev_add and chardev_del monitor commands.
>
> chardev_del is pretty straight forward, it just takes an id argument and
> zaps the chardev specified.
>
> chardev_add is more tricky as there are tons of arguments for the
> different backends. The hmp version limited to the most common use
> cases, especially when it comes to sockets: You can only specify port
> (tcp) or path (unix) and qemu will create a listening socket. For
> example this ...
>
> (qemu) chardev_add foo socket 42
>
> ... will do the same as ...
>
> -chardev socket,id=foo,port=42,server,nowait
Why not
chardev_add socket,id=foo,port=42,server,nowait
?
> +{ 'command': 'chardev_add', 'data': {'id' : 'str',
> + 'backend' : 'str',
> + 'path' : 'str',
> + 'name' : 'str',
> + 'host' : 'str',
> + 'port' : 'str',
You cannot pass NULLs via QMP, so these need to be optional.
I suggest that you implement the commands in a similar way as netdev_add.
Paolo
> + 'server' : 'bool',
> + 'wait' : 'bool',
> + 'ipv4' : 'bool',
> + 'ipv6' : 'bool',
> + 'telnet' : 'bool' } }
> +
> +##
> +# @chardev_del:
> +#
> +# Remove a chardev
> +#
> +# @id: the chardev's ID, must exist and not be in use
> +#
> +# Returns: Nothing on success
> +#
> +# Since: 1.3.0
> +##
> +{ 'command': 'chardev_del', 'data': {'id': 'str'} }
> diff --git a/qemu-char.c b/qemu-char.c
> index b082bae..2f9d860 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -2900,3 +2900,77 @@ CharDriverState *qemu_char_get_next_serial(void)
> return serial_hds[next_serial++];
> }
>
> +void qmp_chardev_add(const char *id, const char *backend,
> + const char *path, const char *name,
> + const char *host, const char *port,
> + bool server, bool wait,
> + bool ipv4, bool ipv6,
> + bool telnet, Error **errp)
> +{
> + CharDriverState *chr;
> + QemuOpts *opts;
> +
> + chr = qemu_chr_find(id);
> + if (NULL != chr) {
> + error_setg(errp, "Chardev id '%s' exists already\n", id);
> + return;
> + }
> +
> + opts = qemu_opts_create(qemu_find_opts("chardev"), id, 1, errp);
> + if (error_is_set(errp)) {
> + return;
> + }
> + qemu_opt_set(opts, "backend", backend);
> + if (path) {
> + qemu_opt_set(opts, "path", path);
> + }
> + if (name) {
> + qemu_opt_set(opts, "name", name);
> + }
> + if (host) {
> + qemu_opt_set(opts, "host", host);
> + }
> + if (port) {
> + qemu_opt_set(opts, "port", port);
> + }
> + if (server) {
> + qemu_opt_set(opts, "server", "on");
> + }
> + if (!wait) {
> + qemu_opt_set(opts, "wait", "off");
> + }
> + if (ipv4) {
> + qemu_opt_set(opts, "ipv4", "on");
> + }
> + if (ipv6) {
> + qemu_opt_set(opts, "ipv6", "on");
> + }
> + if (telnet) {
> + qemu_opt_set(opts, "telnet", "on");
> + }
> +
> + chr = qemu_chr_new_from_opts(opts, NULL);
> + qemu_opts_del(opts);
> +
> + if (chr == NULL) {
> + error_setg(errp, "Creating chardev failed\n");
> + return;
> + }
> +}
> +
> +void qmp_chardev_del(const char *id, Error **errp)
> +{
> + CharDriverState *chr;
> +
> + chr = qemu_chr_find(id);
> + if (NULL == chr) {
> + error_setg(errp, "Chardev '%s' not found\n", id);
> + return;
> + }
> + if (chr->chr_can_read || chr->chr_read ||
> + chr->chr_event || chr->handler_opaque) {
> + error_setg(errp, "Chardev '%s' is busy\n", id);
> + return;
> + }
> + qemu_chr_delete(chr);
> +}
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 2f8477e..b904df2 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -2576,3 +2576,64 @@ EQMP
> .args_type = "",
> .mhandler.cmd_new = qmp_marshal_input_query_target,
> },
> +
> + {
> + .name = "chardev_add",
> + .args_type = "",
> + .mhandler.cmd_new = qmp_marshal_input_chardev_add,
> + },
> +
> +SQMP
> +chardev_add
> +-----------
> +
> +Add a chardev.
> +
> +Arguments:
> +
> +- "id": the chardev's ID, must be unique (json-string)
> +- "backend": the chardev backend: "file", "socket", ... (json-string)
> +- "path": file / device / unix socket path (json-string, optional)
> +- "name": spice channel name (json-string, optional)
> +- "host": host name (json-string, optional)
> +- "port": port number (json-string, optional)
> +- "server": create socket in server mode (json-bool, optional)
> +- "wait": wait for connect (json-bool, optional)
> +- "ipv4": force ipv4-only (json-bool, optional)
> +- "ipv6": force ipv6-only (json-bool, optional)
> +- "telnet": telnet negotiation (json-bool, optional)
> +
> +Example:
> +
> +-> { "execute": "chardev_add", "arguments": { "id" : "foo",
> + "backend" : "socket",
> + "path" : "/tmp/foo",
> + "server" : "on",
> + "wait" : "off" } }
> +<- { "return": {} }
> +
> +EQMP
> +
> + {
> + .name = "chardev_del",
> + .args_type = "",
> + .mhandler.cmd_new = qmp_marshal_input_chardev_del,
> + },
> +
> +
> +SQMP
> +chardev_del
> +-----------
> +
> +Remove a chardev.
> +
> +Arguments:
> +
> +- "id": the chardev's ID, must exist and not be in use (json-string)
> +
> +Example:
> +
> +-> { "execute": "chardev_del", "arguments": { "id" : "foo" } }
> +<- { "return": {} }
> +
> +EQMP
>
next prev parent reply other threads:[~2012-10-12 9:40 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-12 9:25 [Qemu-devel] [PULL 0/7] serial device hotplug patch series Gerd Hoffmann
2012-10-12 9:25 ` [Qemu-devel] [PATCH 1/7] serial: split serial.c Gerd Hoffmann
2012-10-12 9:25 ` [Qemu-devel] [PATCH 2/7] serial: add pci variant Gerd Hoffmann
2012-10-12 9:25 ` [Qemu-devel] [PATCH 3/7] serial: add windows inf file for the pci card to docs Gerd Hoffmann
2012-10-12 9:25 ` [Qemu-devel] [PATCH 4/7] serial: add 2x + 4x pci variant Gerd Hoffmann
2012-10-12 9:26 ` [Qemu-devel] [PATCH 5/7] usb-serial: don't magically zap chardev on umplug Gerd Hoffmann
2012-10-12 9:26 ` [Qemu-devel] [PATCH 6/7] usb-serial: only expose device in guest when the chardev is open Gerd Hoffmann
2012-10-12 9:26 ` [Qemu-devel] [PATCH 7/7] chardev: add hotplug support Gerd Hoffmann
2012-10-12 9:40 ` Paolo Bonzini [this message]
2012-10-12 10:23 ` Gerd Hoffmann
2012-10-12 10:50 ` Paolo Bonzini
2012-10-12 11:15 ` Gerd Hoffmann
2012-10-12 11:17 ` Paolo Bonzini
2012-10-12 12:37 ` Gerd Hoffmann
2012-10-12 12:39 ` [Qemu-devel] [PATCH v2] " Gerd Hoffmann
2012-10-12 13:12 ` Gerd Hoffmann
2012-10-12 16:54 ` Paolo Bonzini
2012-10-12 17:08 ` Paolo Bonzini
2012-10-15 6:51 ` Lei Li
2012-10-15 11:09 ` Andreas Färber
2012-10-16 13:23 ` Luiz Capitulino
2012-10-15 17:36 ` Eric Blake
2012-10-16 14:02 ` Paolo Bonzini
2012-10-12 9:42 ` [Qemu-devel] [PULL 0/7] serial device hotplug patch series Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='k58oib$n0$1@ger.gmane.org' \
--to=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).