--- 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); \
} \