From: Nick Thomas <n...@bytemark.co.uk> Signed-off-by: Nick Thomas <n...@bytemark.co.uk> --- migration-tcp.c | 85 ++++++++----------------------------------------------- 1 files changed, 12 insertions(+), 73 deletions(-)
diff --git a/migration-tcp.c b/migration-tcp.c index d3d80c9..8ae778e 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -48,46 +48,14 @@ static int tcp_close(FdMigrationState *s) return 0; } - -static void tcp_wait_for_connect(void *opaque) -{ - FdMigrationState *s = opaque; - int val, ret; - socklen_t valsize = sizeof(val); - - DPRINTF("connect completed\n"); - do { - ret = getsockopt(s->fd, SOL_SOCKET, SO_ERROR, (void *) &val, &valsize); - } while (ret == -1 && (s->get_error(s)) == EINTR); - - if (ret < 0) { - migrate_fd_error(s); - return; - } - - qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); - - if (val == 0) - migrate_fd_connect(s); - else { - DPRINTF("error connecting %d\n", val); - migrate_fd_error(s); - } -} - MigrationState *tcp_start_outgoing_migration(Monitor *mon, const char *host_port, int64_t bandwidth_limit, int detach, - int blk, - int inc) + int blk, + int inc) { - struct sockaddr_in addr; FdMigrationState *s; - int ret; - - if (parse_host_port(&addr, host_port) < 0) - return NULL; s = qemu_mallocz(sizeof(*s)); @@ -104,32 +72,20 @@ MigrationState *tcp_start_outgoing_migration(Monitor *mon, s->state = MIG_STATE_ACTIVE; s->mon = NULL; s->bandwidth_limit = bandwidth_limit; - s->fd = qemu_socket(PF_INET, SOCK_STREAM, 0); - if (s->fd == -1) { - qemu_free(s); - return NULL; - } - - socket_set_nonblock(s->fd); if (!detach) { migrate_fd_monitor_suspend(s, mon); } - do { - ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); - if (ret == -1) - ret = -(s->get_error(s)); - - if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) - qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s); - } while (ret == -EINTR); + s->fd = inet_connect(host_port, SOCK_STREAM); - if (ret < 0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK) { + if (s->fd == -1) { DPRINTF("connect failed\n"); migrate_fd_error(s); - } else if (ret >= 0) + } else { + socket_set_nonblock(s->fd); migrate_fd_connect(s); + } return &s->mig_state; } @@ -170,34 +126,17 @@ out2: int tcp_start_incoming_migration(const char *host_port) { - struct sockaddr_in addr; - int val; int s; + char *ostr = NULL; - if (parse_host_port(&addr, host_port) < 0) { - fprintf(stderr, "invalid host/port combination: %s\n", host_port); - return -EINVAL; - } - - s = qemu_socket(PF_INET, SOCK_STREAM, 0); - if (s == -1) + s = inet_listen(host_port, ostr, 0, SOCK_STREAM, 0); + if (s == -1) { return -socket_error(); - - val = 1; - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val)); - - if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) - goto err; - - if (listen(s, 1) == -1) - goto err; + } qemu_set_fd_handler2(s, NULL, tcp_accept_incoming_migration, NULL, (void *)(intptr_t)s); return 0; - -err: - close(s); - return -socket_error(); } + -- 1.7.0.4