[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kin
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind |
Date: |
Fri, 20 Jun 2014 21:55:51 +0100 |
Convert the socket char backend to the new style QAPI framework;
this allows it to return an Error ** to callers who might not
want it to print directly about socket failures.
Signed-off-by: Peter Maydell <address@hidden>
---
I'm not 100% sure I have this correct -- review from somebody
who understands the char backends appreciated!
Notes:
* I haven't tested this terribly much...
* The old qemu_chr_open_socket() has an
"if (!is_waitconnect)
qemu_set_nonblock(fd);
which the QMP char-open codepath has never had. Does this matter?
Which of the two code paths was correct?
(I needed this because I wanted to be able to programmatically
create a char backend and not have it spew the error message to
stderr if the port was in use...)
qemu-char.c | 113 ++++++++++++++++++++++++++++++------------------------------
1 file changed, 57 insertions(+), 56 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index b3bd3b5..39c7b9c 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2923,61 +2923,6 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd,
bool do_nodelay,
return chr;
}
-static CharDriverState *qemu_chr_open_socket(QemuOpts *opts)
-{
- CharDriverState *chr = NULL;
- Error *local_err = NULL;
- int fd = -1;
-
- bool is_listen = qemu_opt_get_bool(opts, "server", false);
- bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
- bool is_telnet = qemu_opt_get_bool(opts, "telnet", false);
- bool do_nodelay = !qemu_opt_get_bool(opts, "delay", true);
- bool is_unix = qemu_opt_get(opts, "path") != NULL;
-
- if (is_unix) {
- if (is_listen) {
- fd = unix_listen_opts(opts, &local_err);
- } else {
- fd = unix_connect_opts(opts, &local_err, NULL, NULL);
- }
- } else {
- if (is_listen) {
- fd = inet_listen_opts(opts, 0, &local_err);
- } else {
- fd = inet_connect_opts(opts, &local_err, NULL, NULL);
- }
- }
- if (fd < 0) {
- goto fail;
- }
-
- if (!is_waitconnect)
- qemu_set_nonblock(fd);
-
- chr = qemu_chr_open_socket_fd(fd, do_nodelay, is_listen, is_telnet,
- is_waitconnect, &local_err);
- if (local_err) {
- goto fail;
- }
- return chr;
-
-
- fail:
- if (local_err) {
- qerror_report_err(local_err);
- error_free(local_err);
- }
- if (fd >= 0) {
- closesocket(fd);
- }
- if (chr) {
- g_free(chr->opaque);
- g_free(chr);
- }
- return NULL;
-}
-
/*********************************************************/
/* Ring buffer chardev */
@@ -3384,6 +3329,61 @@ static void qemu_chr_parse_mux(QemuOpts *opts,
ChardevBackend *backend,
backend->mux->chardev = g_strdup(chardev);
}
+static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
+ Error **errp)
+{
+ bool is_listen = qemu_opt_get_bool(opts, "server", false);
+ bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
+ bool is_telnet = qemu_opt_get_bool(opts, "telnet", false);
+ bool do_nodelay = !qemu_opt_get_bool(opts, "delay", true);
+ const char *path = qemu_opt_get(opts, "path");
+ const char *host = qemu_opt_get(opts, "host");
+ const char *port = qemu_opt_get(opts, "port");
+ SocketAddress *addr;
+
+ if (!path) {
+ if (!host) {
+ error_setg(errp, "chardev: socket: no host given");
+ return;
+ }
+ if (!port) {
+ error_setg(errp, "chardev: socket: no port given");
+ return;
+ }
+ }
+
+ backend->socket = g_new0(ChardevSocket, 1);
+
+ backend->socket->has_nodelay = true;
+ backend->socket->nodelay = do_nodelay;
+ backend->socket->has_server = true;
+ backend->socket->server = is_listen;
+ backend->socket->has_telnet = true;
+ backend->socket->telnet = is_telnet;
+ backend->socket->has_wait = true;
+ backend->socket->wait = is_waitconnect;
+
+ addr = g_new0(SocketAddress, 1);
+ if (path) {
+ addr->kind = SOCKET_ADDRESS_KIND_UNIX;
+ addr->q_unix->path = g_strdup(path);
+ } else {
+ addr->kind = SOCKET_ADDRESS_KIND_INET;
+ addr->inet = g_new0(InetSocketAddress, 1);
+ addr->inet->host = g_strdup(host);
+ addr->inet->port = g_strdup(port);
+ addr->inet->to = qemu_opt_get_number(opts, "to", 0);
+ addr->inet->has_to = true;
+ if (qemu_opt_get_bool(opts, "ipv4", 0)) {
+ addr->inet->has_ipv4 = addr->inet->ipv4 = true;
+ }
+ if (qemu_opt_get_bool(opts, "ipv6", 0)) {
+ addr->inet->has_ipv6 = addr->inet->ipv6 = true;
+ }
+ }
+ backend->socket->addr = addr;
+}
+
typedef struct CharDriver {
const char *name;
/* old, pre qapi */
@@ -4064,7 +4064,8 @@ void qmp_chardev_remove(const char *id, Error **errp)
static void register_types(void)
{
register_char_driver_qapi("null", CHARDEV_BACKEND_KIND_NULL, NULL);
- register_char_driver("socket", qemu_chr_open_socket);
+ register_char_driver_qapi("socket", CHARDEV_BACKEND_KIND_SOCKET,
+ qemu_chr_parse_socket);
register_char_driver("udp", qemu_chr_open_udp);
register_char_driver_qapi("ringbuf", CHARDEV_BACKEND_KIND_RINGBUF,
qemu_chr_parse_ringbuf);
--
1.9.2
- [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind,
Peter Maydell <=
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Markus Armbruster, 2014/06/23
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Peter Maydell, 2014/06/23
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Gerd Hoffmann, 2014/06/30
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Peter Maydell, 2014/06/30
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Gerd Hoffmann, 2014/06/30
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Peter Maydell, 2014/06/30
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Paolo Bonzini, 2014/06/30
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Peter Maydell, 2014/06/30
- Re: [Qemu-devel] [PATCH] qemu-char: Convert socket char backend to parse/kind, Paolo Bonzini, 2014/06/30