1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include "qemu/osdep.h"
19#include "qapi/error.h"
20#include "qemu-common.h"
21#include "qemu/sockets.h"
22#include "qemu/main-loop.h"
23#include "migration/migration.h"
24#include "migration/qemu-file.h"
25#include "block/block.h"
26#include <sys/wait.h>
27
28
29
30#ifdef DEBUG_MIGRATION_EXEC
31#define DPRINTF(fmt, ...) \
32 do { printf("migration-exec: " fmt, ## __VA_ARGS__); } while (0)
33#else
34#define DPRINTF(fmt, ...) \
35 do { } while (0)
36#endif
37
38void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp)
39{
40 s->to_dst_file = qemu_popen_cmd(command, "w");
41 if (s->to_dst_file == NULL) {
42 error_setg_errno(errp, errno, "failed to popen the migration target");
43 return;
44 }
45
46 migrate_fd_connect(s);
47}
48
49static void exec_accept_incoming_migration(void *opaque)
50{
51 QEMUFile *f = opaque;
52
53 qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL);
54 process_incoming_migration(f);
55}
56
57void exec_start_incoming_migration(const char *command, Error **errp)
58{
59 QEMUFile *f;
60
61 DPRINTF("Attempting to start an incoming migration\n");
62 f = qemu_popen_cmd(command, "r");
63 if(f == NULL) {
64 error_setg_errno(errp, errno, "failed to popen the migration source");
65 return;
66 }
67
68 qemu_set_fd_handler(qemu_get_fd(f), exec_accept_incoming_migration, NULL,
69 f);
70}
71