From 616018352c244d8b0ea4626407b0801844ae0748 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 30 Aug 2016 14:04:12 +0200 Subject: [PATCH] Revert "Change net/socket.c to use socket_*() functions" Since commit 7e8449594c929, the socket connect code is blocking, because calling socket_connect() without callback is blocking. This reverts the commit. Signed-off-by: Paolo Bonzini --- net/socket.c | 55 ++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/net/socket.c b/net/socket.c index 17e635de2061..3f98eefb3477 100644 --- a/net/socket.c +++ b/net/socket.c @@ -489,30 +489,41 @@ static int net_socket_listen_init(NetClientState *peer, { NetClientState *nc; NetSocketState *s; - SocketAddress *saddr; - int ret; - Error *local_error = NULL; + struct sockaddr_in saddr; + int fd, ret; - saddr = socket_parse(host_str, &local_error); - if (saddr == NULL) { - error_report_err(local_error); + if (parse_host_port(&saddr, host_str) < 0) + return -1; + + fd = qemu_socket(PF_INET, SOCK_STREAM, 0); + if (fd < 0) { + perror("socket"); return -1; } + qemu_set_nonblock(fd); - ret = socket_listen(saddr, &local_error); + socket_set_fast_reuse(fd); + + ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)); if (ret < 0) { - error_report_err(local_error); + perror("bind"); + closesocket(fd); + return -1; + } + ret = listen(fd, 0); + if (ret < 0) { + perror("listen"); + closesocket(fd); return -1; } nc = qemu_new_net_client(&net_socket_info, peer, model, name); s = DO_UPCAST(NetSocketState, nc, nc); s->fd = -1; - s->listen_fd = ret; + s->listen_fd = fd; s->nc.link_down = true; qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s); - qapi_free_SocketAddress(saddr); return 0; } @@ -523,15 +534,10 @@ static int net_socket_connect_init(NetClientState *peer, { NetSocketState *s; int fd, connected, ret; - char *addr_str; - SocketAddress *saddr; - Error *local_error = NULL; + struct sockaddr_in saddr; - saddr = socket_parse(host_str, &local_error); - if (saddr == NULL) { - error_report_err(local_error); + if (parse_host_port(&saddr, host_str) < 0) return -1; - } fd = qemu_socket(PF_INET, SOCK_STREAM, 0); if (fd < 0) { @@ -539,9 +545,10 @@ static int net_socket_connect_init(NetClientState *peer, return -1; } qemu_set_nonblock(fd); + connected = 0; for(;;) { - ret = socket_connect(saddr, &local_error, NULL, NULL); + ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); if (ret < 0) { if (errno == EINTR || errno == EWOULDBLOCK) { /* continue */ @@ -550,7 +557,7 @@ static int net_socket_connect_init(NetClientState *peer, errno == EINVAL) { break; } else { - error_report_err(local_error); + perror("connect"); closesocket(fd); return -1; } @@ -562,15 +569,9 @@ static int net_socket_connect_init(NetClientState *peer, s = net_socket_fd_init(peer, model, name, fd, connected); if (!s) return -1; - - addr_str = socket_address_to_string(saddr, &local_error); - if (addr_str == NULL) - return -1; - snprintf(s->nc.info_str, sizeof(s->nc.info_str), - "socket: connect to %s", addr_str); - qapi_free_SocketAddress(saddr); - g_free(addr_str); + "socket: connect to %s:%d", + inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port)); return 0; }