From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51645) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VnPu5-0005iF-Cm for qemu-devel@nongnu.org; Mon, 02 Dec 2013 04:35:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VnPu1-0007PU-52 for qemu-devel@nongnu.org; Mon, 02 Dec 2013 04:34:57 -0500 Received: from mx1.redhat.com ([209.132.183.28]:23047) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VnPu0-0007PN-TN for qemu-devel@nongnu.org; Mon, 02 Dec 2013 04:34:53 -0500 Date: Mon, 2 Dec 2013 09:33:42 +0000 From: "Daniel P. Berrange" Message-ID: <20131202093341.GA1980@redhat.com> References: <1385975957-22941-1-git-send-email-lilei@linux.vnet.ibm.com> <1385975957-22941-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: <1385975957-22941-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 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 > --- > 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. 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 :|