Fix to allow for recvmsg() returning less data than is needed.

diff --git a/scheduler/client.c b/scheduler/client.c
index 55d73eb..81e6b40 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -170,17 +170,43 @@
     if (len) *len = ret - sizeof(head);
     if (pass_fd != -1) close( pass_fd );
     remaining = head.len - ret;
-    while (remaining > 0)  /* drop remaining data */
+    while (remaining > 0)  /* get remaining data */
     {
-        char buffer[1024];
-        int len = remaining < sizeof(buffer) ? remaining : sizeof(buffer);
-        if ((len = recv( thdb->socket, buffer, len, 0 )) == -1)
+        char *bufp, buffer[1024];
+        int addlen, i, iovtot = 0;
+
+	/* see if any iovs are still incomplete, otherwise drop the rest */
+	for (i = 0; i < veclen && remaining > 0; i++)
+	{
+	    if (iovtot + vec[i].iov_len > head.len - remaining)
+	    {
+		addlen = iovtot + vec[i].iov_len - (head.len - remaining);
+		bufp = (char *)vec[i].iov_base + (vec[i].iov_len - addlen);
+		if (addlen > remaining) addlen = remaining;
+		if ((addlen = recv( thdb->socket, bufp, addlen, 0 )) == -1)
+		{
+		    perror( "recv" );
+		    CLIENT_ProtocolError( "recv\n" );
+		}
+		if (!addlen) ExitThread(1); /* the server closed the connection; time to die... */
+		if (len) *len += addlen;
+		remaining -= addlen;
+	    }
+	    iovtot += vec[i].iov_len;
+	}
+
+	if (remaining > 0)
+	    addlen = remaining < sizeof(buffer) ? remaining : sizeof(buffer);
+	else
+	    break;
+
+        if ((addlen = recv( thdb->socket, buffer, addlen, 0 )) == -1)
         {
             perror( "recv" );
             CLIENT_ProtocolError( "recv\n" );
         }
-        if (!len) ExitThread(1); /* the server closed the connection; time to die... */
-        remaining -= len;
+        if (!addlen) ExitThread(1); /* the server closed the connection; time to die... */
+        remaining -= addlen;
     }
 
     SetLastError( head.type );