From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:51360) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF6fV-0007jD-On for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:05:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TF6fU-0008WA-AP for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:05:33 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:43020) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF6fU-0008KE-3y for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:05:32 -0400 Received: by mail-pb0-f45.google.com with SMTP id rp12so8110795pbb.4 for ; Fri, 21 Sep 2012 10:05:31 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 21 Sep 2012 19:05:00 +0200 Message-Id: <1348247106-27936-4-git-send-email-pbonzini@redhat.com> In-Reply-To: <1348247106-27936-1-git-send-email-pbonzini@redhat.com> References: <1348247106-27936-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 3/9] migration: add qemu_get_fd List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: quintela@redhat.com Add a callback that lets incoming migration retrieve the file descriptor for a QEMUFile. This will replace the type-unsafe qemu_stdio_fd. Signed-off-by: Paolo Bonzini --- buffered_file.c | 8 ++++++++ qemu-file.h | 6 ++++++ savevm.c | 27 +++++++++++++++++++++++++++ 3 file modificati, 41 inserzioni(+) diff --git a/buffered_file.c b/buffered_file.c index 535cdf5..2943f2e 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -173,6 +173,13 @@ static int buffered_close(void *opaque) * 1: Time to stop * 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) { QEMUFileBuffered *s = opaque; @@ -234,6 +241,7 @@ static void buffered_rate_tick(void *opaque) } static const QEMUFileOps buffered_file_ops = { + .get_fd = buffered_get_fd, .put_buffer = buffered_put_buffer, .close = buffered_close, .rate_limit = buffered_rate_limit, diff --git a/qemu-file.h b/qemu-file.h index c89e8e0..d552f5d 100644 --- a/qemu-file.h +++ b/qemu-file.h @@ -47,6 +47,10 @@ typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf, */ 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 * bandwidth capping is a soft limit, not a hard limit. */ @@ -63,6 +67,7 @@ typedef struct QEMUFileOps { QEMUFilePutBufferFunc *put_buffer; QEMUFileGetBufferFunc *get_buffer; QEMUFileCloseFunc *close; + QEMUFileGetFD *get_fd; QEMUFileRateLimit *rate_limit; QEMUFileSetRateLimit *set_rate_limit; QEMUFileGetRateLimit *get_rate_limit; @@ -74,6 +79,7 @@ QEMUFile *qemu_fdopen(int fd, const char *mode); QEMUFile *qemu_fopen_socket(int fd); QEMUFile *qemu_popen(FILE *popen_file, 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_fclose(QEMUFile *f); void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size); diff --git a/savevm.c b/savevm.c index 0751422..334848a 100644 --- a/savevm.c +++ b/savevm.c @@ -187,6 +187,13 @@ typedef struct QEMUFileSocket QEMUFile *file; } 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) { QEMUFileSocket *s = opaque; @@ -209,6 +216,13 @@ static int socket_close(void *opaque) 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) { QEMUFileStdio *s = opaque; @@ -252,11 +266,13 @@ static int stdio_fclose(void *opaque) } static const QEMUFileOps stdio_pipe_read_ops = { + .get_fd = stdio_get_fd, .get_buffer = stdio_get_buffer, .close = stdio_pclose }; static const QEMUFileOps stdio_pipe_write_ops = { + .get_fd = stdio_get_fd, .put_buffer = stdio_put_buffer, .close = stdio_pclose }; @@ -306,11 +322,13 @@ int qemu_stdio_fd(QEMUFile *f) } static const QEMUFileOps stdio_file_read_ops = { + .get_fd = stdio_get_fd, .get_buffer = stdio_get_buffer, .close = stdio_fclose }; static const QEMUFileOps stdio_file_write_ops = { + .get_fd = stdio_get_fd, .put_buffer = stdio_put_buffer, .close = stdio_fclose }; @@ -344,6 +362,7 @@ fail: } static const QEMUFileOps socket_read_ops = { + .get_fd = socket_get_fd, .get_buffer = socket_get_buffer, .close = socket_close }; @@ -491,6 +510,14 @@ static void qemu_fill_buffer(QEMUFile *f) 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 * * Returns negative error value if any error happened on previous operations or -- 1.7.12