s4:heimdal: import lorikeet-heimdal-201001120029 (commit a5e675fed7c5db8a7370b77ed0bf...
[sfrench/samba-autobuild/.git] / source4 / heimdal / lib / roken / net_read.c
index 9d055d0068287420a51610ef195f4ff64e6a8713..b57dda3ddae6dd03f325b5a2a5726df92e59f047 100644 (file)
 
 #include <config.h>
 
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-
 #include "roken.h"
 
 /*
  * Like read but never return partial data.
  */
 
-ssize_t ROKEN_LIB_FUNCTION
-net_read (int fd, void *buf, size_t nbytes)
+#ifndef _WIN32
+
+ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
+net_read (rk_socket_t fd, void *buf, size_t nbytes)
 {
     char *cbuf = (char *)buf;
     ssize_t count;
     size_t rem = nbytes;
 
     while (rem > 0) {
-#ifdef WIN32
-       count = recv (fd, cbuf, rem, 0);
-#else
        count = read (fd, cbuf, rem);
-#endif
        if (count < 0) {
            if (errno == EINTR)
                continue;
@@ -69,3 +63,36 @@ net_read (int fd, void *buf, size_t nbytes)
     }
     return nbytes;
 }
+
+#else
+
+ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
+net_read(rk_socket_t sock, void *buf, size_t nbytes)
+{
+    char *cbuf = (char *)buf;
+    ssize_t count;
+    size_t rem = nbytes;
+
+    while (rem > 0) {
+       count = recv (sock, cbuf, rem, 0);
+       if (count < 0) {
+
+           /* With WinSock, the error EINTR (WSAEINTR), is used to
+              indicate that a blocking call was cancelled using
+              WSACancelBlockingCall(). */
+
+#ifndef HAVE_WINSOCK
+           if (rk_SOCK_ERRNO == EINTR)
+               continue;
+#endif
+           return count;
+       } else if (count == 0) {
+           return count;
+       }
+       cbuf += count;
+       rem -= count;
+    }
+    return nbytes;
+}
+
+#endif