qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 06/17] migration-local: add send_pipefd()


From: Lei Li
Subject: Re: [Qemu-devel] [PATCH 06/17] migration-local: add send_pipefd()
Date: Tue, 03 Dec 2013 22:23:08 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0

On 12/03/2013 07:52 PM, Paolo Bonzini wrote:
Il 03/12/2013 12:19, Lei Li ha scritto:
On 12/02/2013 05:33 PM, Daniel P. Berrange wrote:
On Mon, Dec 02, 2013 at 05:19:06PM +0800, Lei Li wrote:
This patch adds send_pipefd() to pass the pipe file descriptor
to destination process.

Signed-off-by: Lei Li <address@hidden>
---
   migration-local.c |   46
++++++++++++++++++++++++++++++++++++++++++++++
   1 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/migration-local.c b/migration-local.c
index 929ed60..f479530 100644
--- a/migration-local.c
+++ b/migration-local.c
@@ -167,3 +167,49 @@ fail:
       g_free(s);
       return NULL;
   }
+
+
+/*
+ * Pass a pipe file descriptor to another process.
+ *
+ * Return negative value If pipefd < 0. Return 0 on
+ * success.
+ *
+ */
+static int send_pipefd(int sockfd, int pipefd)
+{
+    struct msghdr msg;
+    struct iovec iov[1];
+    ssize_t ret;
+    char req[1] = { 0x01 };
+
+    union {
+      struct cmsghdr cm;
+      char control[CMSG_SPACE(sizeof(int))];
+    } control_un;
+    struct cmsghdr *cmptr;
+
+    msg.msg_control = control_un.control;
+    msg.msg_controllen = sizeof(control_un.control);
+
+    cmptr = CMSG_FIRSTHDR(&msg);
+    cmptr->cmsg_len = CMSG_LEN(sizeof(int));
+    cmptr->cmsg_level = SOL_SOCKET;
+    cmptr->cmsg_type = SCM_RIGHTS;
+    *((int *) CMSG_DATA(cmptr)) = pipefd;
+
+    msg.msg_name = NULL;
+    msg.msg_namelen = 0;
+
+    iov[0].iov_base = req;
+    iov[0].iov_len = sizeof(req);
+    msg.msg_iov = iov;
+    msg.msg_iovlen = 1;
+
+    ret = sendmsg(sockfd, &msg, 0);
+    if (ret <= 0) {
+        DPRINTF("sendmsg error: %s\n", strerror(errno));
+    }
+
+    return ret;
+}
Just a reminder about my comments from previous posting. This is
introducing a 3rd private function for sending FDs. The existing
code should be refactored into qemu-socket.{c,h} and shared.
Hi Daniel,

Yes, I remembered your suggestion. As my reply in the previous version,
I'll make this refactoring in a separate thread. There are some differences
between these private functions (like data type and length of bytes
transmitted), may need a little time to get the common method settle down,
and would be better to do some test to make sure there is no impact on
them.
You would have to implement it in such a way that the buffer is
specified in the function, for example:

ssize_t qemu_send_with_fd(int sockfd, int passed_fd, const void *buf,
                           size_t len);
ssize_t qemu_recv_with_fd(int sockfd, int *passed_fd, void *buf,
                           size_t len);

The functions can go in util/ (I think not in qemu-socket.c, a new file
is preferrable).

I don't think it's particularly important, but it's definitely welcome.

Hi Paolo,

Thanks for your specified suggestion! As it needs to test the related
code (tap/bridge & Proxy FS & flipping migration), I will work on it
after back from my vacation next week.  :-)


Paolo



--
Lei




reply via email to

[Prev in Thread] Current Thread [Next in Thread]