diff options
Diffstat (limited to 'otherlibs/win32unix/write.c')
-rw-r--r-- | otherlibs/win32unix/write.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/otherlibs/win32unix/write.c b/otherlibs/win32unix/write.c index ce7429d05..5c0e54e3d 100644 --- a/otherlibs/win32unix/write.c +++ b/otherlibs/win32unix/write.c @@ -24,9 +24,7 @@ CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) { long ofs, len, written; DWORD numbytes, numwritten; - BOOL ret; char iobuf[UNIX_BUFFER_SIZE]; - HANDLE h = Handle_val(fd); Begin_root (buf); ofs = Long_val(vofs); @@ -35,12 +33,27 @@ CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) while (len > 0) { numbytes = len > UNIX_BUFFER_SIZE ? UNIX_BUFFER_SIZE : len; memmove (iobuf, &Byte(buf, ofs), numbytes); - enter_blocking_section(); - ret = WriteFile(h, iobuf, numbytes, &numwritten, NULL); - leave_blocking_section(); - if (! ret) { - win32_maperr(GetLastError()); - uerror("write", Nothing); + if (Descr_kind_val(fd) == KIND_SOCKET) { + int ret; + SOCKET s = Socket_val(fd); + enter_blocking_section(); + ret = send(s, iobuf, numbytes, 0); + leave_blocking_section(); + if (ret == SOCKET_ERROR) { + win32_maperr(WSAGetLastError()); + uerror("write", Nothing); + } + numwritten = ret; + } else { + BOOL ret; + HANDLE h = Handle_val(fd); + enter_blocking_section(); + ret = WriteFile(h, iobuf, numbytes, &numwritten, NULL); + leave_blocking_section(); + if (! ret) { + win32_maperr(GetLastError()); + uerror("write", Nothing); + } } written += numwritten; ofs += numwritten; |