ExternalStream.st
changeset 21002 49a490d35fc3
parent 21001 0010ffe368ed
child 21003 cb88897f9538
--- a/ExternalStream.st	Tue Nov 22 19:19:39 2016 +0100
+++ b/ExternalStream.st	Tue Nov 22 20:19:05 2016 +0100
@@ -405,16 +405,21 @@
             CLEAR_ERRNO;                                \
             {                                           \
               int res = -1, ok = 0;                     \
-              if ((handleType == @symbol(socketFilePointer) && ((ok = ioctlsocket((SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res) == 0), 1)) \
-                  || (handleType == @symbol(socketHandle) && ((ok = ioctlsocket((SOCKET)(f), FIONREAD, &res) == 0), 1)) \
+              HANDLE sock = 0;                          \
+              if ((handleType == @symbol(socketFilePointer) && ((ok = ioctlsocket(sock = (SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res) == 0), 1)) \
+                  || (handleType == @symbol(socketHandle) && ((ok = ioctlsocket(sock = (SOCKET)(f), FIONREAD, &res) == 0), 1)) \
                   || (handleType == @symbol(pipeFilePointer) && ((ok = PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0, 0,0,&res,0)), 1))) { \
-                  if (!ok) { (ret) = -1; CLEAR_ERRNO; break; }       \
+                  if (!ok) { (ret) = -1; break; }       \
                   if (res > 0) {                        \
                       if (res > ((cnt)-__offs))         \
                           res = (cnt)-__offs;           \
                       READ((ret), f, (buf)+__offs, res, handleType); \
                   } else {                              \
-                      (ret) = res;                      \
+                      if (sock && recv(sock, NULL, 0, 0) == SOCKET_ERROR) {     \
+                        (ret) = -1; __threadErrno = WSAGetLastError();          \
+                      } else {                          \
+                        (ret) = 0;                      \
+                      }                                 \
                       break;                            \
                   }                                     \
               } else {                                  \
@@ -542,20 +547,25 @@
             }                                        \
             {                                        \
                 int res = -1, ok = 0;                \
+                HANDLE sock = 0;                     \
                 int l = (cnt)-__offs;                \
                 CLEAR_ERRNO;                         \
                 if (l > IO_BUFFER_SIZE) l = IO_BUFFER_SIZE;              \
-                if ((handleType == @symbol(socketFilePointer) && ((ok = ioctlsocket((SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res) == 0), 1)) \
-                    || (handleType == @symbol(socketHandle) && ((ok = ioctlsocket((SOCKET)(f), FIONREAD, &res) == 0), 1)) \
+                if ((handleType == @symbol(socketFilePointer) && ((ok = ioctlsocket(sock = (SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res) == 0), 1)) \
+                    || (handleType == @symbol(socketHandle) && ((ok = ioctlsocket(sock = (SOCKET)(f), FIONREAD, &res) == 0), 1)) \
                     || (handleType == @symbol(pipeFilePointer) && ((ok = PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0, 0,0,&res,0)), 1))) { \
-                   if (!ok) { (ret) = -1; CLEAR_ERRNO; break; }       \
+                   if (!ok) { (ret) = -1; break; }       \
                    if (res > 0) {                   \
                         if (res > l) res = l;       \
                         READ((ret), f, __buf, res, handleType); \
-                    } else {                         \
-                        (ret) = res;                 \
-                        break;                       \
-                    }                                \
+                   } else {                              \
+                       if (sock && recv(sock, NULL, 0, 0) == SOCKET_ERROR) {     \
+                         (ret) = -1; __threadErrno = WSAGetLastError();          \
+                       } else {                          \
+                         (ret) = 0;                      \
+                       }                                 \
+                       break;                            \
+                   }                                     \
                 } else {                             \
                     READ((ret), f, __buf, l, handleType); \
                 }                                     \