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