diff options
Diffstat (limited to 'otherlibs/win32unix/read.c')
-rw-r--r-- | otherlibs/win32unix/read.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/otherlibs/win32unix/read.c b/otherlibs/win32unix/read.c index d970cc321..2c727173e 100644 --- a/otherlibs/win32unix/read.c +++ b/otherlibs/win32unix/read.c @@ -22,19 +22,32 @@ CAMLprim value unix_read(value fd, value buf, value ofs, value len) { DWORD numbytes, numread; - BOOL ret; char iobuf[UNIX_BUFFER_SIZE]; - HANDLE h = Handle_val(fd); Begin_root (buf); numbytes = Long_val(len); if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; - enter_blocking_section(); - ret = ReadFile(h, iobuf, numbytes, &numread, NULL); - leave_blocking_section(); - if (! ret) { - win32_maperr(GetLastError()); - uerror("read", Nothing); + if (Descr_kind_val(fd) == KIND_SOCKET) { + int ret; + SOCKET s = Socket_val(fd); + enter_blocking_section(); + ret = recv(s, iobuf, numbytes, 0); + leave_blocking_section(); + if (ret == SOCKET_ERROR) { + win32_maperr(WSAGetLastError()); + uerror("read", Nothing); + } + numread = ret; + } else { + BOOL ret; + HANDLE h = Handle_val(fd); + enter_blocking_section(); + ret = ReadFile(h, iobuf, numbytes, &numread, NULL); + leave_blocking_section(); + if (! ret) { + win32_maperr(GetLastError()); + uerror("read", Nothing); + } } memmove (&Byte(buf, Long_val(ofs)), iobuf, numread); End_roots(); |