Use tcp_client_start() in those two functions: tcp_start_outgoing_migration() net_socket_connect_init() Changes from v2: - return real error in net_socket_connect_init(), not always -1 Signed-off-by: Amos Kong <akong@xxxxxxxxxx> --- migration-tcp.c | 39 +++++++++++---------------------------- net/socket.c | 43 ++++++++++++------------------------------- 2 files changed, 23 insertions(+), 59 deletions(-) diff --git a/migration-tcp.c b/migration-tcp.c index ecadd10..b74be1c 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -81,43 +81,26 @@ 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; - } - 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, &s->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 (s->fd != -1) { + 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..0ecbc84 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 ret; + } else { + connected = 1; } + s = net_socket_fd_init(vlan, model, name, fd, connected); if (!s) return -1; @@ -621,7 +602,7 @@ int net_init_socket(QemuOpts *opts, connect = qemu_opt_get(opts, "connect"); - if (net_socket_connect_init(vlan, "socket", name, connect) == -1) { + if (net_socket_connect_init(vlan, "socket", name, connect) < 0) { return -1; } } else if (qemu_opt_get(opts, "mcast")) { -- 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