summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-24 21:55:17 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-24 21:55:17 +0000
commitc1d366653207033b811c85da8c839729786451a5 (patch)
tree246e541f100a13b6f77d2869c669c806f10e146f
parent17e909738da65d315d462839a05628580b96f8c1 (diff)
downloadqemu-c1d366653207033b811c85da8c839729786451a5.tar.gz
Live migration for Win32 (Hervé Poussineau)
This patch fixes migration so that it works on Win32. This requires using socket specific calls since sockets cannot be treated like file descriptors on win32. Signed-off-by: Hervé Poussineau <hpoussin@reactos.org> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5525 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--hw/hw.h2
-rw-r--r--migration-tcp.c22
-rw-r--r--vl.c24
3 files changed, 24 insertions, 24 deletions
diff --git a/hw/hw.h b/hw/hw.h
index 8edd7887c3..99d4b8d755 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -34,7 +34,7 @@ QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
QEMUFileCloseFunc *close,
QEMUFileRateLimit *rate_limit);
QEMUFile *qemu_fopen(const char *filename, const char *mode);
-QEMUFile *qemu_fopen_fd(int fd);
+QEMUFile *qemu_fopen_socket(int fd);
void qemu_fflush(QEMUFile *f);
int qemu_fclose(QEMUFile *f);
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
diff --git a/migration-tcp.c b/migration-tcp.c
index a011a53099..64b64d6b98 100644
--- a/migration-tcp.c
+++ b/migration-tcp.c
@@ -85,10 +85,10 @@ static ssize_t fd_put_buffer(void *opaque, const void *data, size_t size)
do {
ret = send(s->fd, data, size, 0);
- } while (ret == -1 && errno == EINTR);
+ } while (ret == -1 && (socket_error() == EINTR || socket_error() == EWOULDBLOCK));
if (ret == -1)
- ret = -errno;
+ ret = -socket_error();
if (ret == -EAGAIN)
qemu_set_fd_handler2(s->fd, NULL, NULL, fd_put_notify, s);
@@ -123,7 +123,7 @@ static void fd_wait_for_unfreeze(void *opaque)
FD_SET(s->fd, &wfds);
ret = select(s->fd + 1, NULL, &wfds, NULL, NULL);
- } while (ret == -1 && errno == EINTR);
+ } while (ret == -1 && socket_error() == EINTR);
}
static void fd_put_ready(void *opaque)
@@ -178,7 +178,7 @@ static void tcp_wait_for_connect(void *opaque)
dprintf("connect completed\n");
do {
ret = getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &val, &valsize);
- } while (ret == -1 && errno == EINTR);
+ } while (ret == -1 && socket_error() == EINTR);
if (ret < 0) {
tcp_error(s);
@@ -273,13 +273,13 @@ MigrationState *tcp_start_outgoing_migration(const char *host_port,
do {
ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr));
if (ret == -1)
- ret = -errno;
+ ret = -socket_error();
- if (ret == -EINPROGRESS)
+ if (ret == -EINPROGRESS || ret == -EWOULDBLOCK)
qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s);
} while (ret == -EINTR);
- if (ret < 0 && ret != -EINPROGRESS) {
+ if (ret < 0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK) {
dprintf("connect failed\n");
close(s->fd);
qemu_free(s);
@@ -300,7 +300,7 @@ static void tcp_accept_incoming_migration(void *opaque)
do {
c = accept(s, (struct sockaddr *)&addr, &addrlen);
- } while (c == -1 && errno == EINTR);
+ } while (c == -1 && socket_error() == EINTR);
dprintf("accepted migration\n");
@@ -309,7 +309,7 @@ static void tcp_accept_incoming_migration(void *opaque)
return;
}
- f = qemu_fopen_fd(c);
+ f = qemu_fopen_socket(c);
if (f == NULL) {
fprintf(stderr, "could not qemu_fopen socket\n");
goto out;
@@ -349,7 +349,7 @@ int tcp_start_incoming_migration(const char *host_port)
s = socket(PF_INET, SOCK_STREAM, 0);
if (s == -1)
- return -errno;
+ return -socket_error();
val = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
@@ -367,5 +367,5 @@ int tcp_start_incoming_migration(const char *host_port)
err:
close(s);
- return -errno;
+ return -socket_error();
}
diff --git a/vl.c b/vl.c
index 74ae652e1e..1fb474925e 100644
--- a/vl.c
+++ b/vl.c
@@ -6252,43 +6252,43 @@ struct QEMUFile {
int has_error;
};
-typedef struct QEMUFileFD
+typedef struct QEMUFileSocket
{
int fd;
QEMUFile *file;
-} QEMUFileFD;
+} QEMUFileSocket;
-static int fd_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
+static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
{
- QEMUFileFD *s = opaque;
+ QEMUFileSocket *s = opaque;
ssize_t len;
do {
- len = read(s->fd, buf, size);
- } while (len == -1 && errno == EINTR);
+ len = recv(s->fd, buf, size, 0);
+ } while (len == -1 && socket_error() == EINTR);
if (len == -1)
- len = -errno;
+ len = -socket_error();
return len;
}
-static int fd_close(void *opaque)
+static int socket_close(void *opaque)
{
- QEMUFileFD *s = opaque;
+ QEMUFileSocket *s = opaque;
qemu_free(s);
return 0;
}
-QEMUFile *qemu_fopen_fd(int fd)
+QEMUFile *qemu_fopen_socket(int fd)
{
- QEMUFileFD *s = qemu_mallocz(sizeof(QEMUFileFD));
+ QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
if (s == NULL)
return NULL;
s->fd = fd;
- s->file = qemu_fopen_ops(s, NULL, fd_get_buffer, fd_close, NULL);
+ s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL);
return s->file;
}