提交 70eb6330 编写于 作者: P Paolo Bonzini

migration: add qemu_get_fd

Reviewed-by: NOrit Wasserman <owasserm@redhat.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 9229bf3c
...@@ -174,6 +174,13 @@ static int buffered_close(void *opaque) ...@@ -174,6 +174,13 @@ static int buffered_close(void *opaque)
* 1: Time to stop * 1: Time to stop
* negative: There has been an error * negative: There has been an error
*/ */
static int buffered_get_fd(void *opaque)
{
QEMUFileBuffered *s = opaque;
return qemu_get_fd(s->file);
}
static int buffered_rate_limit(void *opaque) static int buffered_rate_limit(void *opaque)
{ {
QEMUFileBuffered *s = opaque; QEMUFileBuffered *s = opaque;
...@@ -235,6 +242,7 @@ static void buffered_rate_tick(void *opaque) ...@@ -235,6 +242,7 @@ static void buffered_rate_tick(void *opaque)
} }
static const QEMUFileOps buffered_file_ops = { static const QEMUFileOps buffered_file_ops = {
.get_fd = buffered_get_fd,
.put_buffer = buffered_put_buffer, .put_buffer = buffered_put_buffer,
.close = buffered_close, .close = buffered_close,
.rate_limit = buffered_rate_limit, .rate_limit = buffered_rate_limit,
......
...@@ -47,6 +47,10 @@ typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf, ...@@ -47,6 +47,10 @@ typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
*/ */
typedef int (QEMUFileCloseFunc)(void *opaque); typedef int (QEMUFileCloseFunc)(void *opaque);
/* Called to return the OS file descriptor associated to the QEMUFile.
*/
typedef int (QEMUFileGetFD)(void *opaque);
/* Called to determine if the file has exceeded its bandwidth allocation. The /* Called to determine if the file has exceeded its bandwidth allocation. The
* bandwidth capping is a soft limit, not a hard limit. * bandwidth capping is a soft limit, not a hard limit.
*/ */
...@@ -63,6 +67,7 @@ typedef struct QEMUFileOps { ...@@ -63,6 +67,7 @@ typedef struct QEMUFileOps {
QEMUFilePutBufferFunc *put_buffer; QEMUFilePutBufferFunc *put_buffer;
QEMUFileGetBufferFunc *get_buffer; QEMUFileGetBufferFunc *get_buffer;
QEMUFileCloseFunc *close; QEMUFileCloseFunc *close;
QEMUFileGetFD *get_fd;
QEMUFileRateLimit *rate_limit; QEMUFileRateLimit *rate_limit;
QEMUFileSetRateLimit *set_rate_limit; QEMUFileSetRateLimit *set_rate_limit;
QEMUFileGetRateLimit *get_rate_limit; QEMUFileGetRateLimit *get_rate_limit;
...@@ -74,6 +79,7 @@ QEMUFile *qemu_fdopen(int fd, const char *mode); ...@@ -74,6 +79,7 @@ QEMUFile *qemu_fdopen(int fd, const char *mode);
QEMUFile *qemu_fopen_socket(int fd); QEMUFile *qemu_fopen_socket(int fd);
QEMUFile *qemu_popen(FILE *popen_file, const char *mode); QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
QEMUFile *qemu_popen_cmd(const char *command, const char *mode); QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
int qemu_get_fd(QEMUFile *f);
int qemu_stdio_fd(QEMUFile *f); int qemu_stdio_fd(QEMUFile *f);
int qemu_fclose(QEMUFile *f); int qemu_fclose(QEMUFile *f);
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size); void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
......
...@@ -188,6 +188,13 @@ typedef struct QEMUFileSocket ...@@ -188,6 +188,13 @@ typedef struct QEMUFileSocket
QEMUFile *file; QEMUFile *file;
} QEMUFileSocket; } QEMUFileSocket;
static int socket_get_fd(void *opaque)
{
QEMUFileSocket *s = opaque;
return s->fd;
}
static int socket_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)
{ {
QEMUFileSocket *s = opaque; QEMUFileSocket *s = opaque;
...@@ -210,6 +217,13 @@ static int socket_close(void *opaque) ...@@ -210,6 +217,13 @@ static int socket_close(void *opaque)
return 0; return 0;
} }
static int stdio_get_fd(void *opaque)
{
QEMUFileStdio *s = opaque;
return fileno(s->stdio_file);
}
static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
{ {
QEMUFileStdio *s = opaque; QEMUFileStdio *s = opaque;
...@@ -253,11 +267,13 @@ static int stdio_fclose(void *opaque) ...@@ -253,11 +267,13 @@ static int stdio_fclose(void *opaque)
} }
static const QEMUFileOps stdio_pipe_read_ops = { static const QEMUFileOps stdio_pipe_read_ops = {
.get_fd = stdio_get_fd,
.get_buffer = stdio_get_buffer, .get_buffer = stdio_get_buffer,
.close = stdio_pclose .close = stdio_pclose
}; };
static const QEMUFileOps stdio_pipe_write_ops = { static const QEMUFileOps stdio_pipe_write_ops = {
.get_fd = stdio_get_fd,
.put_buffer = stdio_put_buffer, .put_buffer = stdio_put_buffer,
.close = stdio_pclose .close = stdio_pclose
}; };
...@@ -307,11 +323,13 @@ int qemu_stdio_fd(QEMUFile *f) ...@@ -307,11 +323,13 @@ int qemu_stdio_fd(QEMUFile *f)
} }
static const QEMUFileOps stdio_file_read_ops = { static const QEMUFileOps stdio_file_read_ops = {
.get_fd = stdio_get_fd,
.get_buffer = stdio_get_buffer, .get_buffer = stdio_get_buffer,
.close = stdio_fclose .close = stdio_fclose
}; };
static const QEMUFileOps stdio_file_write_ops = { static const QEMUFileOps stdio_file_write_ops = {
.get_fd = stdio_get_fd,
.put_buffer = stdio_put_buffer, .put_buffer = stdio_put_buffer,
.close = stdio_fclose .close = stdio_fclose
}; };
...@@ -345,6 +363,7 @@ fail: ...@@ -345,6 +363,7 @@ fail:
} }
static const QEMUFileOps socket_read_ops = { static const QEMUFileOps socket_read_ops = {
.get_fd = socket_get_fd,
.get_buffer = socket_get_buffer, .get_buffer = socket_get_buffer,
.close = socket_close .close = socket_close
}; };
...@@ -492,6 +511,14 @@ static void qemu_fill_buffer(QEMUFile *f) ...@@ -492,6 +511,14 @@ static void qemu_fill_buffer(QEMUFile *f)
qemu_file_set_error(f, len); qemu_file_set_error(f, len);
} }
int qemu_get_fd(QEMUFile *f)
{
if (f->ops->get_fd) {
return f->ops->get_fd(f->opaque);
}
return -1;
}
/** Closes the file /** Closes the file
* *
* Returns negative error value if any error happened on previous operations or * Returns negative error value if any error happened on previous operations or
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册