From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36458) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXWdZ-0005op-TY for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:41:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZXWdT-0008HM-QS for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:41:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41422) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXWdT-0008HI-K9 for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:41:11 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 52B4DA8E for ; Thu, 3 Sep 2015 15:41:11 +0000 (UTC) From: "Daniel P. Berrange" Date: Thu, 3 Sep 2015 16:39:22 +0100 Message-Id: <1441294768-8712-41-git-send-email-berrange@redhat.com> In-Reply-To: <1441294768-8712-1-git-send-email-berrange@redhat.com> References: <1441294768-8712-1-git-send-email-berrange@redhat.com> Subject: [Qemu-devel] [PATCH FYI 40/46] migration: convert exec socket protocol to use QIOChannel List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Juan Quintela , "Dr. David Alan Gilbert" , Gerd Hoffmann , Amit Shah , Paolo Bonzini Convert the exec socket migration protocol driver to use QIOChannel and QEMUFileChannel, instead of the stdio popen APIs. It can be unconditionally built because the QIOChannelCommand class can report suitable error messages on platforms which can't fork processes. Signed-off-by: Daniel P. Berrange --- migration/Makefile.objs | 3 +-- migration/exec.c | 48 ++++++++++++++++++++++++++++++------------------ migration/migration.c | 4 ---- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/migration/Makefile.objs b/migration/Makefile.objs index 2d1d8cd..c43c78a 100644 --- a/migration/Makefile.objs +++ b/migration/Makefile.objs @@ -1,11 +1,10 @@ -common-obj-y += migration.o tcp.o unix.o fd.o +common-obj-y += migration.o tcp.o unix.o fd.o exec.o common-obj-y += vmstate.o common-obj-y += qemu-file.o qemu-file-unix.o qemu-file-stdio.o common-obj-y += qemu-file-channel.o common-obj-y += xbzrle.o common-obj-$(CONFIG_RDMA) += rdma.o -common-obj-$(CONFIG_POSIX) += exec.o common-obj-y += block.o diff --git a/migration/exec.c b/migration/exec.c index 8406d2b..6159aba 100644 --- a/migration/exec.c +++ b/migration/exec.c @@ -15,14 +15,8 @@ * GNU GPL, version 2 or (at your option) any later version. */ -#include "qemu-common.h" -#include "qemu/sockets.h" -#include "qemu/main-loop.h" #include "migration/migration.h" -#include "migration/qemu-file.h" -#include "block/block.h" -#include -#include +#include "io/channel-command.h" //#define DEBUG_MIGRATION_EXEC @@ -36,34 +30,52 @@ void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp) { - s->file = qemu_popen_cmd(command, "w"); - if (s->file == NULL) { - error_setg_errno(errp, errno, "failed to popen the migration target"); + QIOChannel *ioc; + const char *argv[] = { "/bin/sh", "-c", command, NULL }; + + DPRINTF("Attempting to start an outgoing migration\n"); + ioc = QIO_CHANNEL(qio_channel_command_new_spawn(argv, + O_WRONLY, + errp)); + if (!ioc) { return; } + s->file = qemu_fopen_channel_output(ioc); + object_unref(OBJECT(ioc)); + migrate_fd_connect(s); } -static void exec_accept_incoming_migration(void *opaque) +static gboolean exec_accept_incoming_migration(QIOChannel *ioc, + GIOCondition condition, + gpointer opaque) { QEMUFile *f = opaque; - - qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL); process_incoming_migration(f); + return FALSE; } void exec_start_incoming_migration(const char *command, Error **errp) { QEMUFile *f; + QIOChannel *ioc; + const char *argv[] = { "/bin/sh", "-c", command, NULL }; DPRINTF("Attempting to start an incoming migration\n"); - f = qemu_popen_cmd(command, "r"); - if(f == NULL) { - error_setg_errno(errp, errno, "failed to popen the migration source"); + ioc = QIO_CHANNEL(qio_channel_command_new_spawn(argv, + O_RDONLY, + errp)); + if (!ioc) { return; } - qemu_set_fd_handler(qemu_get_fd(f), exec_accept_incoming_migration, NULL, - f); + f = qemu_fopen_channel_input(ioc); + object_unref(OBJECT(ioc)); + + qio_channel_add_watch(ioc, + G_IO_IN, + exec_accept_incoming_migration, + f, + NULL); } diff --git a/migration/migration.c b/migration/migration.c index f8cf8dc..f025226 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -253,10 +253,8 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) } else if (strstart(uri, "rdma:", &p)) { rdma_start_incoming_migration(p, errp); #endif -#if !defined(WIN32) } else if (strstart(uri, "exec:", &p)) { exec_start_incoming_migration(p, errp); -#endif } else if (strstart(uri, "unix:", &p)) { unix_start_incoming_migration(p, errp); } else if (strstart(uri, "fd:", &p)) { @@ -744,10 +742,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, } else if (strstart(uri, "rdma:", &p)) { rdma_start_outgoing_migration(s, p, &local_err); #endif -#if !defined(WIN32) } else if (strstart(uri, "exec:", &p)) { exec_start_outgoing_migration(s, p, &local_err); -#endif } else if (strstart(uri, "unix:", &p)) { unix_start_outgoing_migration(s, p, &local_err); } else if (strstart(uri, "fd:", &p)) { -- 2.4.3