Use tcp_client_start() in those two functions: tcp_start_outgoing_migration() net_socket_connect_init() Signed-off-by: Amos Kong <akong@xxxxxxxxxx> --- migration-tcp.c | 41 +++++++++++++---------------------------- net/socket.c | 41 +++++++++++------------------------------ 2 files changed, 24 insertions(+), 58 deletions(-) diff --git a/migration-tcp.c b/migration-tcp.c index ecadd10..4f89bff 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -81,43 +81,28 @@ static void tcp_wait_for_connect(void *opaque) int tcp_start_outgoing_migration(MigrationState *s, const char *host_port) { - struct sockaddr_in addr; int ret; - - ret = parse_host_port(&addr, host_port); - if (ret < 0) { - return ret; - } + int fd; s->get_error = socket_errno; s->write = socket_write; s->close = tcp_close; - s->fd = qemu_socket(PF_INET, SOCK_STREAM, 0); - if (s->fd == -1) { - DPRINTF("Unable to open socket"); - return -socket_error(); - } - - socket_set_nonblock(s->fd); - - do { - ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); - if (ret == -1) { - ret = -socket_error(); - } - if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) { - qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s); - return 0; - } - } while (ret == -EINTR); - - if (ret < 0) { + ret = tcp_client_start(host_port, &fd); + s->fd = fd; + if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) { + DPRINTF("connect in progress"); + qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s); + } else if (ret < 0) { DPRINTF("connect failed\n"); - migrate_fd_error(s); + if (ret != -EINVAL) { + migrate_fd_error(s); + } return ret; + } else { + migrate_fd_connect(s); } - migrate_fd_connect(s); + return 0; } diff --git a/net/socket.c b/net/socket.c index 5feb3d2..b7cd8ec 100644 --- a/net/socket.c +++ b/net/socket.c @@ -434,41 +434,22 @@ static int net_socket_connect_init(VLANState *vlan, const char *host_str) { NetSocketState *s; - int fd, connected, ret, err; + int fd, connected, ret; struct sockaddr_in saddr; - 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; - } - socket_set_nonblock(fd); - - connected = 0; - for(;;) { - ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); - if (ret < 0) { - err = socket_error(); - if (err == EINTR || err == EWOULDBLOCK) { - } else if (err == EINPROGRESS) { - break; + ret = tcp_client_start(host_str, &fd); + if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) { + connected = 0; #ifdef _WIN32 - } else if (err == WSAEALREADY || err == WSAEINVAL) { - break; + } else if (ret == -WSAEALREADY || ret == -WSAEINVAL) { + connected = 0; #endif - } else { - perror("connect"); - closesocket(fd); - return -1; - } - } else { - connected = 1; - break; - } + } else if (ret < 0) { + return -1; + } else { + connected = 1; } + s = net_socket_fd_init(vlan, model, name, fd, connected); if (!s) return -1; -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html