Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Dec 2013 22:58:09 +0000 (UTC)
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r259430 - head/lib/libnv
Message-ID:  <201312152258.rBFMw9ip027967@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pjd
Date: Sun Dec 15 22:58:09 2013
New Revision: 259430
URL: http://svnweb.freebsd.org/changeset/base/259430

Log:
  MFp4 @1189139:
  
  Get rid of the msg_peek() function, which has a problem.  If there was less
  data in the socket buffer than requested by the caller, the function would busy
  loop, as select(2) will always return immediately.
  
  We can just receive nvlhdr now, because some time ago we splitted receive of
  data from the receive of descriptors.
  
  MFC after:	1 week

Modified:
  head/lib/libnv/msgio.c
  head/lib/libnv/msgio.h
  head/lib/libnv/nvlist.c

Modified: head/lib/libnv/msgio.c
==============================================================================
--- head/lib/libnv/msgio.c	Sun Dec 15 22:52:18 2013	(r259429)
+++ head/lib/libnv/msgio.c	Sun Dec 15 22:58:09 2013	(r259430)
@@ -113,30 +113,6 @@ fd_wait(int fd, bool doread)
 	    NULL, NULL);
 }
 
-int
-msg_peek(int sock, void *buf, size_t size)
-{
-	ssize_t done;
-
-	PJDLOG_ASSERT(sock >= 0);
-	PJDLOG_ASSERT(size > 0);
-
-	do {
-		fd_wait(sock, true);
-		done = recv(sock, buf, size, MSG_PEEK | MSG_WAITALL);
-		if (done == -1) {
-			if (errno == EAGAIN || errno == EINTR)
-				continue;
-			return (-1);
-		} else if (done == 0) {
-			errno = ENOTCONN;
-			return (-1);
-		}
-	} while (done != (ssize_t)size);
-
-	return (0);
-}
-
 static int
 msg_recv(int sock, struct msghdr *msg)
 {

Modified: head/lib/libnv/msgio.h
==============================================================================
--- head/lib/libnv/msgio.h	Sun Dec 15 22:52:18 2013	(r259429)
+++ head/lib/libnv/msgio.h	Sun Dec 15 22:58:09 2013	(r259430)
@@ -38,8 +38,6 @@ struct cmsgcred;
 struct iovec;
 struct msghdr;
 
-int msg_peek(int sock, void *buf, size_t size);
-
 int cred_send(int sock);
 int cred_recv(int sock, struct cmsgcred *cred);
 

Modified: head/lib/libnv/nvlist.c
==============================================================================
--- head/lib/libnv/nvlist.c	Sun Dec 15 22:52:18 2013	(r259429)
+++ head/lib/libnv/nvlist.c	Sun Dec 15 22:58:09 2013	(r259430)
@@ -724,11 +724,11 @@ nvlist_recv(int sock)
 {
 	struct nvlist_header nvlhdr;
 	nvlist_t *nvl, *ret;
+	unsigned char *buf;
 	size_t nfds, size;
-	void *buf;
 	int serrno, *fds;
 
-	if (msg_peek(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
+	if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
 		return (NULL);
 
 	if (!nvlist_check_header(&nvlhdr))
@@ -741,10 +741,12 @@ nvlist_recv(int sock)
 	if (buf == NULL)
 		return (NULL);
 
+	memcpy(buf, &nvlhdr, sizeof(nvlhdr));
+
 	ret = NULL;
 	fds = NULL;
 
-	if (buf_recv(sock, buf, size) == -1)
+	if (buf_recv(sock, buf + sizeof(nvlhdr), size - sizeof(nvlhdr)) == -1)
 		goto out;
 
 	if (nfds > 0) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312152258.rBFMw9ip027967>