From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39647) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSyIT-0006U4-AX for qemu-devel@nongnu.org; Thu, 28 Jul 2016 23:17:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSyIM-00039t-Pk for qemu-devel@nongnu.org; Thu, 28 Jul 2016 23:17:10 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34324) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSyIM-00039o-II for qemu-devel@nongnu.org; Thu, 28 Jul 2016 23:17:06 -0400 Date: Fri, 29 Jul 2016 06:17:03 +0300 From: "Michael S. Tsirkin" Message-ID: <1469762011-7902-35-git-send-email-mst@redhat.com> References: <1469762011-7902-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <1469762011-7902-1-git-send-email-mst@redhat.com> Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 34/41] char: add and use tcp_chr_wait_connected List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , =?iso-8859-1?Q?Marc-Andr=E9?= Lureau , Paolo Bonzini From: Marc-Andr=E9 Lureau Add a chr_wait_connected for the tcp backend, and use it in the open_socket() function. Signed-off-by: Marc-Andr=E9 Lureau Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- 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; } =20 +static int tcp_chr_wait_connected(CharDriverState *chr, Error **errp) +{ + TCPCharDriver *s =3D 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, N= ULL); + 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 =3D 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(con= st char *id, s->addr =3D QAPI_CLONE(SocketAddress, sock->addr); =20 chr->opaque =3D s; + chr->chr_wait_connected =3D tcp_chr_wait_connected; chr->chr_write =3D tcp_chr_write; chr->chr_sync_read =3D tcp_chr_sync_read; chr->chr_close =3D tcp_chr_close; @@ -4425,32 +4452,30 @@ static CharDriverState *qmp_chardev_open_socket(c= onst char *id, s->reconnect_time =3D reconnect; } =20 - sioc =3D qio_channel_socket_new(); if (s->reconnect_time) { + sioc =3D 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 =3D 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 =3D 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 =3D qio_channel_socket_new(); + if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0)= { + goto error; + } + s->listen_ioc =3D sioc; + if (is_waitconnect && + qemu_chr_wait_connected(chr, errp) < 0) { + goto error; + } + if (!s->ioc) { + s->listen_tag =3D 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)); } =20 return chr; --=20 MST