summaryrefslogtreecommitdiff
path: root/source4/heimdal/lib/roken/net_read.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/heimdal/lib/roken/net_read.c')
-rw-r--r--source4/heimdal/lib/roken/net_read.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/source4/heimdal/lib/roken/net_read.c b/source4/heimdal/lib/roken/net_read.c
index b57dda3dda..df1ac53def 100644
--- a/source4/heimdal/lib/roken/net_read.c
+++ b/source4/heimdal/lib/roken/net_read.c
@@ -73,8 +73,28 @@ net_read(rk_socket_t sock, void *buf, size_t nbytes)
ssize_t count;
size_t rem = nbytes;
+#ifdef SOCKET_IS_NOT_AN_FD
+ int use_read = 0;
+#endif
+
while (rem > 0) {
+#ifdef SOCKET_IS_NOT_AN_FD
+ if (use_read)
+ count = _read (sock, cbuf, rem);
+ else
+ count = recv (sock, cbuf, rem, 0);
+
+ if (use_read == 0 &&
+ rk_IS_SOCKET_ERROR(count) &&
+ (rk_SOCK_ERRNO == WSANOTINITIALISED ||
+ rk_SOCK_ERRNO == WSAENOTSOCK)) {
+ use_read = 1;
+
+ count = _read (sock, cbuf, rem);
+ }
+#else
count = recv (sock, cbuf, rem, 0);
+#endif
if (count < 0) {
/* With WinSock, the error EINTR (WSAEINTR), is used to