platform: fix tcp socket error handling and return value.
authorLars Op den Kamp <lars@opdenkamp.eu>
Thu, 9 Feb 2012 14:36:59 +0000 (15:36 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Thu, 9 Feb 2012 14:39:54 +0000 (15:39 +0100)
src/lib/platform/windows/os-socket.h

index 60badd78372a9a91d8655489466d6607af00f98b..5174cba1aaa5e5db4535a345a844c10d005d47b2 100644 (file)
@@ -147,7 +147,7 @@ namespace PLATFORM
 
     ssize_t iReturn = send(socket, (char*)data, (int)len, 0);
     if (iReturn < (ssize_t)len)
-      *iError = errno;
+      *iError = GetSocketError();
     return iReturn;
   }
 
@@ -184,19 +184,28 @@ namespace PLATFORM
         FD_SET(socket, &fd_read);
 
         if (select((int)socket + 1, &fd_read, NULL, NULL, &tv) == 0)
+        {
+          *iError = ETIMEDOUT;
           return ETIMEDOUT;
+        }
         TcpSocketSetBlocking(socket, false);
       }
 
       ssize_t iReadResult = (iTimeoutMs > 0) ?
-          recv(socket, (char*)data + iBytesRead, (int)(len - iBytesRead), MSG_WAITALL) :
+          recv(socket, (char*)data + iBytesRead, (int)(len - iBytesRead), 0) :
           recv(socket, (char*)data, (int)len, MSG_WAITALL);
       *iError = GetSocketError();
+
+      if (iTimeoutMs > 0)
+      {
+        TcpSocketSetBlocking(socket, true);
+        iNow = GetTimeMs();
+      }
+
       if (iReadResult < 0)
       {
-        if (errno == EAGAIN && iTimeoutMs > 0)
+        if (*iError == EAGAIN && iTimeoutMs > 0)
           continue;
-        *iError = errno;
         return -1;
       }
       else if (iReadResult == 0 || (iReadResult != (ssize_t)len && iTimeoutMs == 0))
@@ -206,14 +215,12 @@ namespace PLATFORM
       }
 
       iBytesRead += iReadResult;
-
-      if (iTimeoutMs > 0)
-      {
-        TcpSocketSetBlocking(socket, true);
-        iNow = GetTimeMs();
-      }
     }
-    return 0;
+
+    if (iBytesRead < (ssize_t)len && *iError == 0)
+      *iError = ETIMEDOUT;
+
+    return iBytesRead;
   }
 
   inline bool TcpResolveAddress(const char *strHost, uint16_t iPort, int *iError, struct addrinfo **info)
@@ -279,7 +286,7 @@ namespace PLATFORM
       }
       else
       {
-        *iError = errno;
+        *iError = GetSocketError();
       }
     }