Both for incomming and outgoing migration. Signed-off-by: Juan Quintela <quint...@redhat.com> --- migration/tcp.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/migration/tcp.c b/migration/tcp.c index e1fa7f8..5d42c96 100644 --- a/migration/tcp.c +++ b/migration/tcp.c @@ -33,10 +33,16 @@ do { } while (0) #endif +struct OutgoingArgs { + MigrationState *s; +}; + static void tcp_wait_for_connect(int fd, Error *err, void *opaque) { - MigrationState *s = opaque; + struct OutgoingArgs *args = opaque; + MigrationState *s = args->s; + g_free(args); if (fd < 0) { DPRINTF("migrate connect error: %s\n", error_get_pretty(err)); s->to_dst_file = NULL; @@ -50,17 +56,26 @@ static void tcp_wait_for_connect(int fd, Error *err, void *opaque) void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp) { - inet_nonblocking_connect(host_port, tcp_wait_for_connect, s, errp); + struct OutgoingArgs *args = g_new0(struct OutgoingArgs, 1); + + args->s = s; + inet_nonblocking_connect(host_port, tcp_wait_for_connect, args, errp); } +struct IncomingArgs { + int s; +}; + static void tcp_accept_incoming_migration(void *opaque) { + struct IncomingArgs *args = opaque; struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); - int s = (intptr_t)opaque; + int s = args->s; QEMUFile *f; int c; + g_free(args); do { c = qemu_accept(s, (struct sockaddr *)&addr, &addrlen); } while (c < 0 && errno == EINTR); @@ -80,7 +95,6 @@ static void tcp_accept_incoming_migration(void *opaque) error_report("could not qemu_fopen socket"); goto out; } - process_incoming_migration(f); return; @@ -90,13 +104,14 @@ out: void tcp_start_incoming_migration(const char *host_port, Error **errp) { + struct IncomingArgs *args = g_new0(struct IncomingArgs, 1); int s; s = inet_listen(host_port, NULL, 256, SOCK_STREAM, 0, errp); if (s < 0) { + g_free(args); return; } - - qemu_set_fd_handler(s, tcp_accept_incoming_migration, NULL, - (void *)(intptr_t)s); + args->s = s; + qemu_set_fd_handler(s, tcp_accept_incoming_migration, NULL, args); } -- 2.5.5