aboutsummaryrefslogtreecommitdiff
path: root/migration-exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'migration-exec.c')
-rw-r--r--migration-exec.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/migration-exec.c b/migration-exec.c
index 6ed322a98..2e7fdc21d 100644
--- a/migration-exec.c
+++ b/migration-exec.c
@@ -108,18 +108,11 @@ err_after_alloc:
return NULL;
}
-int exec_start_incoming_migration(const char *command)
+static void exec_accept_incoming_migration(void *opaque)
{
+ QEMUFile *f = opaque;
int ret;
- QEMUFile *f;
- dprintf("Attempting to start an incoming migration\n");
- f = qemu_popen_cmd(command, "r");
- if(f == NULL) {
- dprintf("Unable to apply qemu wrapper to popen file\n");
- return -errno;
- }
- vm_stop(0); /* just in case */
ret = qemu_loadvm_state(f);
if (ret < 0) {
fprintf(stderr, "load of migration failed\n");
@@ -127,11 +120,27 @@ int exec_start_incoming_migration(const char *command)
}
qemu_announce_self();
dprintf("successfully loaded vm state\n");
- vm_start();
- qemu_fclose(f);
- return 0;
+ /* we've successfully migrated, close the fd */
+ qemu_set_fd_handler2(qemu_popen_fd(f), NULL, NULL, NULL, NULL);
err:
qemu_fclose(f);
- return -errno;
+}
+
+int exec_start_incoming_migration(const char *command)
+{
+ QEMUFile *f;
+
+ dprintf("Attempting to start an incoming migration\n");
+ f = qemu_popen_cmd(command, "r");
+ if(f == NULL) {
+ dprintf("Unable to apply qemu wrapper to popen file\n");
+ return -errno;
+ }
+
+ qemu_set_fd_handler2(qemu_popen_fd(f), NULL,
+ exec_accept_incoming_migration, NULL,
+ (void *)(unsigned long)f);
+
+ return 0;
}