From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40222) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmM1y-0002Wu-Q0 for qemu-devel@nongnu.org; Fri, 29 Nov 2013 06:14:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VmM1u-0007VW-VP for qemu-devel@nongnu.org; Fri, 29 Nov 2013 06:14:42 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42127) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmM1u-0007VQ-NQ for qemu-devel@nongnu.org; Fri, 29 Nov 2013 06:14:38 -0500 Date: Fri, 29 Nov 2013 11:14:27 +0000 From: "Daniel P. Berrange" Message-ID: <20131129111427.GB3714@redhat.com> References: <1385719584-21114-1-git-send-email-lilei@linux.vnet.ibm.com> <1385719584-21114-7-git-send-email-lilei@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1385719584-21114-7-git-send-email-lilei@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH 06/17] migration-local: add send_pipefd() Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Lei Li Cc: aarcange@redhat.com, quintela@redhat.com, qemu-devel@nongnu.org, mrhines@linux.vnet.ibm.com, aliguori@amazon.com, lagarcia@br.ibm.com, pbonzini@redhat.com, rcj@linux.vnet.ibm.com On Fri, Nov 29, 2013 at 06:06:13PM +0800, Lei Li wrote: > This patch adds send_pipefd() to pass the pipe file descriptor > to destination process. > > Signed-off-by: Lei Li > --- > 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; > +} There are already two copies of this function in QEMU, not to mention several copies of code for receving FDs. Rather than adding yet more copies of this functionality it would be much better to add 2 methods to util/qemu-sockets.{c,h} for sending and receiving file descriptors and update all existing code to use them. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|