Revision
100365
Author
cal@macports.org
Date
2012-12-09 09:15:30 -0800 (Sun, 09 Dec 2012)

Log Message

darwintrace: loop around first recv(2), too

Sometimes, I saw "!!! received %zd, but should have been %zd", which
means the size of the buffer to be read wasn't read completely in the
first call to recv(2). Wrapping this in a loop, too, should fix this.

Modified Paths

Diff

Modified: trunk/base/src/darwintracelib1.0/darwintrace.c (100364 => 100365)


--- trunk/base/src/darwintracelib1.0/darwintrace.c	2012-12-09 17:09:47 UTC (rev 100364)
+++ trunk/base/src/darwintracelib1.0/darwintrace.c	2012-12-09 17:15:30 UTC (rev 100365)
@@ -550,19 +550,21 @@
 		size_t recv_len = 0, received;
 		char *recv_buf;
 		
-		ssize_t t;
-		if (-1 == (t = recv(__darwintrace_fd, &recv_len, sizeof(recv_len), 0))) {
-			debug_printf("error reading data from socket %d: %s\n", __darwintrace_fd, strerror(errno));
-			if (__darwintrace_debug)
-				fprintf(__darwintrace_debug, "darwintrace: error reading data from socket %d: %s\n", __darwintrace_fd, strerror(errno));
-			abort();
+		received = 0;
+		while (received < sizeof(recv_len)) {
+			ssize_t local_received = recv(__darwintrace_fd, ((char *) &recv_len) + received, sizeof(recv_len) - received, 0);
+			if (local_received == -1) {
+				debug_printf("error reading data from socket %d: %s\n", __darwintrace_fd, strerror(errno));
+				if (__darwintrace_debug)
+					fprintf(__darwintrace_debug, "darwintrace: error reading data from socket %d: %s\n", __darwintrace_fd, strerror(errno));
+				abort();
+			}
+			received += local_received;
 		}
-		if (t != sizeof(recv_len)) {
-			debug_printf("!!! received %zd, but should have been %zd\n", t, sizeof(recv_len));
-		}
 		if (recv_len == 0) {
 			return 0;
 		}
+
 		recv_buf = malloc(recv_len + 1);
 		recv_buf[recv_len] = '\0';