[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 24/33] char: add and use tcp_chr_wait_connected
From: |
marcandre . lureau |
Subject: |
[Qemu-devel] [PATCH v6 24/33] char: add and use tcp_chr_wait_connected |
Date: |
Wed, 27 Jul 2016 01:15:18 +0400 |
From: Marc-André Lureau <address@hidden>
Add a chr_wait_connected for the tcp backend, and use it in the
open_socket() function.
Signed-off-by: Marc-André Lureau <address@hidden>
---
qemu-char.c | 63 ++++++++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 44 insertions(+), 19 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index 6eba615..a50b8fb 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -3139,6 +3139,32 @@ static gboolean tcp_chr_accept(QIOChannel *channel,
return TRUE;
}
+static int tcp_chr_wait_connected(CharDriverState *chr, Error **errp)
+{
+ TCPCharDriver *s = chr->opaque;
+ QIOChannelSocket *sioc;
+
+ while (!s->connected) {
+ if (s->is_listen) {
+ fprintf(stderr, "QEMU waiting for connection on: %s\n",
+ chr->filename);
+ qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), true, NULL);
+ tcp_chr_accept(QIO_CHANNEL(s->listen_ioc), G_IO_IN, chr);
+ qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false, NULL);
+ } else {
+ sioc = qio_channel_socket_new();
+ if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
+ object_unref(OBJECT(sioc));
+ return -1;
+ }
+ tcp_chr_new_client(chr, sioc);
+ object_unref(OBJECT(sioc));
+ }
+ }
+
+ return 0;
+}
+
int qemu_chr_wait_connected(CharDriverState *chr, Error **errp)
{
if (chr->chr_wait_connected) {
@@ -4402,6 +4428,7 @@ static CharDriverState *qmp_chardev_open_socket(const
char *id,
s->addr = QAPI_CLONE(SocketAddress, sock->addr);
chr->opaque = s;
+ chr->chr_wait_connected = tcp_chr_wait_connected;
chr->chr_write = tcp_chr_write;
chr->chr_sync_read = tcp_chr_sync_read;
chr->chr_close = tcp_chr_close;
@@ -4425,32 +4452,30 @@ static CharDriverState *qmp_chardev_open_socket(const
char *id,
s->reconnect_time = reconnect;
}
- sioc = qio_channel_socket_new();
if (s->reconnect_time) {
+ sioc = qio_channel_socket_new();
qio_channel_socket_connect_async(sioc, s->addr,
qemu_chr_socket_connected,
chr, NULL);
- } else if (s->is_listen) {
- if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0) {
- goto error;
- }
- s->listen_ioc = sioc;
- if (is_waitconnect) {
- fprintf(stderr, "QEMU waiting for connection on: %s\n",
- chr->filename);
- tcp_chr_accept(QIO_CHANNEL(s->listen_ioc), G_IO_IN, chr);
- }
- qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false, NULL);
- if (!s->ioc) {
- s->listen_tag = qio_channel_add_watch(
- QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr,
NULL);
- }
} else {
- if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
+ if (s->is_listen) {
+ sioc = qio_channel_socket_new();
+ if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0) {
+ goto error;
+ }
+ s->listen_ioc = sioc;
+ if (is_waitconnect &&
+ qemu_chr_wait_connected(chr, errp) < 0) {
+ goto error;
+ }
+ if (!s->ioc) {
+ s->listen_tag = qio_channel_add_watch(
+ QIO_CHANNEL(s->listen_ioc), G_IO_IN,
+ tcp_chr_accept, chr, NULL);
+ }
+ } else if (qemu_chr_wait_connected(chr, errp) < 0) {
goto error;
}
- tcp_chr_new_client(chr, sioc);
- object_unref(OBJECT(sioc));
}
return chr;
--
2.9.0
- [Qemu-devel] [PATCH v6 13/33] vhost: use error_report() instead of fprintf(stderr, ...), (continued)
- [Qemu-devel] [PATCH v6 13/33] vhost: use error_report() instead of fprintf(stderr, ...), marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 15/33] vhost-user: call set_msgfds unconditionally, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 16/33] vhost-user: check qemu_chr_fe_set_msgfds() return value, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 17/33] vhost-user: check vhost_user_{read, write}() return value, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 18/33] vhost-user: keep vhost_net after a disconnection, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 19/33] vhost-user: add get_vhost_net() assertions, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 20/33] Revert "vhost-net: do not crash if backend is not present", marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 21/33] vhost-net: vhost_migration_done is vhost-user specific, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 22/33] vhost: add assert() to check runtime behaviour, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 23/33] char: add chr_wait_connected callback, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 24/33] char: add and use tcp_chr_wait_connected,
marcandre . lureau <=
- [Qemu-devel] [PATCH v6 25/33] vhost-user: wait until backend init is completed, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 26/33] tests: plug some leaks in virtio-net-test, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 27/33] tests: fix vhost-user-test leak, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 29/33] tests: add a simple /vhost-user/multiqueue test, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 28/33] tests: add /vhost-user/connect-fail test, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 30/33] vhost-user: add error report in vhost_user_write(), marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 31/33] vhost: add vhost_net_set_backend(), marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 32/33] vhost-user-test: add flags mismatch test, marcandre . lureau, 2016/07/26
- [Qemu-devel] [PATCH v6 33/33] RFC: vhost: do not update last avail idx on get_vring_base() failure, marcandre . lureau, 2016/07/26