The non-blocking connect mechanism doesn't work well in net connection, it still blocks on DNS lookups. So it is obsolete. Supersede it with QIOchannel.
Signed-off-by: Mao Zhongyi <maozy.f...@cn.fujitsu.com> --- The test steps like this: $ qemu-system-x86_64 -net nic -net socket,listen=:1234 ~/img/test.img $ qemu-system-x86_64 -net nic -net socket,connect=127.0.0.1:1234 ~/img/test.img No exception. net/socket.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/net/socket.c b/net/socket.c index fe3547b..1886f98 100644 --- a/net/socket.c +++ b/net/socket.c @@ -33,6 +33,7 @@ #include "qemu/sockets.h" #include "qemu/iov.h" #include "qemu/main-loop.h" +#include "io/channel-socket.h" typedef struct NetSocketState { NetClientState nc; @@ -525,16 +526,21 @@ typedef struct { char *name; } socket_connect_data; -static void socket_connect_data_free(socket_connect_data *c) +static void socket_connect_data_free(void *opaque) { + socket_connect_data *c = opaque; + if (!c) { + return; + } qapi_free_SocketAddress(c->saddr); g_free(c->model); g_free(c->name); g_free(c); } -static void net_socket_connected(int fd, Error *err, void *opaque) +static void net_socket_connected(QIOTask *task, void *opaque) { + QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task)); socket_connect_data *c = opaque; NetSocketState *s; char *addr_str = NULL; @@ -543,13 +549,13 @@ static void net_socket_connected(int fd, Error *err, void *opaque) addr_str = socket_address_to_string(c->saddr, &local_error); if (addr_str == NULL) { error_report_err(local_error); - closesocket(fd); + closesocket(sioc->fd); goto end; } - s = net_socket_fd_init(c->peer, c->model, c->name, fd, true); + s = net_socket_fd_init(c->peer, c->model, c->name, sioc->fd, true); if (!s) { - closesocket(fd); + closesocket(sioc->fd); goto end; } @@ -567,7 +573,7 @@ static int net_socket_connect_init(NetClientState *peer, const char *host_str) { socket_connect_data *c = g_new0(socket_connect_data, 1); - int fd = -1; + QIOChannelSocket *sioc; Error *local_error = NULL; c->peer = peer; @@ -578,10 +584,12 @@ static int net_socket_connect_init(NetClientState *peer, goto err; } - fd = socket_connect(c->saddr, &local_error, net_socket_connected, c); - if (fd < 0) { - goto err; - } + sioc = qio_channel_socket_new(); + qio_channel_socket_connect_async(sioc, + c->saddr, + net_socket_connected, + c, + NULL); return 0; -- 2.9.3