Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 122 lines (101 sloc) 2.563 kb
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
1 /*
2 * QEMU live migration
3 *
4 * Copyright IBM, Corp. 2008
5 * Copyright Dell MessageOne 2008
6 *
7 * Authors:
8 * Anthony Liguori <aliguori@us.ibm.com>
9 * Charles Duffy <charles_duffy@messageone.com>
10 *
11 * This work is licensed under the terms of the GNU GPL, version 2. See
12 * the COPYING file in the top-level directory.
13 *
14 */
15
16 #include "qemu-common.h"
17 #include "qemu_socket.h"
18 #include "migration.h"
19 #include "qemu-char.h"
20 #include "buffered_file.h"
21 #include "block.h"
0ffbba3 @blueswirl migration-exec: fix OpenBSD build warning
blueswirl authored
22 #include <sys/types.h>
23 #include <sys/wait.h>
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
24
25 //#define DEBUG_MIGRATION_EXEC
26
27 #ifdef DEBUG_MIGRATION_EXEC
d0f2c4c @moosotc Do not use dprintf
moosotc authored
28 #define DPRINTF(fmt, ...) \
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
29 do { printf("migration-exec: " fmt, ## __VA_ARGS__); } while (0)
30 #else
d0f2c4c @moosotc Do not use dprintf
moosotc authored
31 #define DPRINTF(fmt, ...) \
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
32 do { } while (0)
33 #endif
34
22f00a4 @juanquintela migration: Rename FdMigrationState MigrationState
juanquintela authored
35 static int file_errno(MigrationState *s)
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
36 {
37 return errno;
38 }
39
22f00a4 @juanquintela migration: Rename FdMigrationState MigrationState
juanquintela authored
40 static int file_write(MigrationState *s, const void * buf, size_t size)
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
41 {
42 return write(s->fd, buf, size);
43 }
44
22f00a4 @juanquintela migration: Rename FdMigrationState MigrationState
juanquintela authored
45 static int exec_close(MigrationState *s)
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
46 {
41ef56e migration: respect exit status with exec:
Anthony Liguori authored
47 int ret = 0;
d0f2c4c @moosotc Do not use dprintf
moosotc authored
48 DPRINTF("exec_close\n");
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
49 if (s->opaque) {
41ef56e migration: respect exit status with exec:
Anthony Liguori authored
50 ret = qemu_fclose(s->opaque);
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
51 s->opaque = NULL;
52 s->fd = -1;
41ef56e migration: respect exit status with exec:
Anthony Liguori authored
53 if (ret != -1 &&
54 WIFEXITED(ret)
55 && WEXITSTATUS(ret) == 0) {
56 ret = 0;
57 } else {
58 ret = -1;
59 }
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
60 }
41ef56e migration: respect exit status with exec:
Anthony Liguori authored
61 return ret;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
62 }
63
07af445 @juanquintela migration: move migrate_new to do_migrate
juanquintela authored
64 int exec_start_outgoing_migration(MigrationState *s, const char *command)
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
65 {
66 FILE *f;
67
68 f = popen(command, "w");
69 if (f == NULL) {
d0f2c4c @moosotc Do not use dprintf
moosotc authored
70 DPRINTF("Unable to popen exec target\n");
07af445 @juanquintela migration: move migrate_new to do_migrate
juanquintela authored
71 goto err_after_popen;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
72 }
73
74 s->fd = fileno(f);
75 if (s->fd == -1) {
d0f2c4c @moosotc Do not use dprintf
moosotc authored
76 DPRINTF("Unable to retrieve file descriptor for popen'd handle\n");
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
77 goto err_after_open;
78 }
79
9075000 Fix detached migration with exec.
Chris Lalancette authored
80 socket_set_nonblock(s->fd);
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
81
82 s->opaque = qemu_popen(f, "w");
83
8ad9fa5 Fix brown-paper-bag bugs from live-migration patch (Charles Duffy)
aliguori authored
84 s->close = exec_close;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
85 s->get_error = file_errno;
86 s->write = file_write;
87
88 migrate_fd_connect(s);
07af445 @juanquintela migration: move migrate_new to do_migrate
juanquintela authored
89 return 0;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
90
91 err_after_open:
92 pclose(f);
07af445 @juanquintela migration: move migrate_new to do_migrate
juanquintela authored
93 err_after_popen:
94 return -1;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
95 }
96
8a43b1e Allow monitor interaction when using migrate -exec
Chris Lalancette authored
97 static void exec_accept_incoming_migration(void *opaque)
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
98 {
8a43b1e Allow monitor interaction when using migrate -exec
Chris Lalancette authored
99 QEMUFile *f = opaque;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
100
511c023 @juanquintela Factorize common migration incoming code
juanquintela authored
101 process_incoming_migration(f);
cfaf6d3 @juanquintela migration: Clear fd also in error cases
juanquintela authored
102 qemu_set_fd_handler2(qemu_stdio_fd(f), NULL, NULL, NULL, NULL);
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
103 qemu_fclose(f);
8a43b1e Allow monitor interaction when using migrate -exec
Chris Lalancette authored
104 }
105
106 int exec_start_incoming_migration(const char *command)
107 {
108 QEMUFile *f;
109
d0f2c4c @moosotc Do not use dprintf
moosotc authored
110 DPRINTF("Attempting to start an incoming migration\n");
8a43b1e Allow monitor interaction when using migrate -exec
Chris Lalancette authored
111 f = qemu_popen_cmd(command, "r");
112 if(f == NULL) {
d0f2c4c @moosotc Do not use dprintf
moosotc authored
113 DPRINTF("Unable to apply qemu wrapper to popen file\n");
8a43b1e Allow monitor interaction when using migrate -exec
Chris Lalancette authored
114 return -errno;
115 }
116
7f79dd2 @bonzini unify popen/fopen qemu wrappers
bonzini authored
117 qemu_set_fd_handler2(qemu_stdio_fd(f), NULL,
1c39e2a @juanquintela remove useless cast
juanquintela authored
118 exec_accept_incoming_migration, NULL, f);
8a43b1e Allow monitor interaction when using migrate -exec
Chris Lalancette authored
119
120 return 0;
065e281 Reintroduce migrate-to-exec: support (Charles Duffy)
aliguori authored
121 }
Something went wrong with that request. Please try again.