diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2006-10-18 08:17:32 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2006-10-18 08:17:32 +0000 |
commit | 741d1e70781e74a523e3a142ec6176422671c8c1 (patch) | |
tree | bb654e809b7a5ab6f82a35f3f9bcc4fe3e01cf89 /otherlibs/win32unix/write.c | |
parent | b74f4b01e790de7c237a74ca12e2972443c81c5b (diff) |
PR#4097: Tentative fix, to be tested
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@7695 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/win32unix/write.c')
-rw-r--r-- | otherlibs/win32unix/write.c | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/otherlibs/win32unix/write.c b/otherlibs/win32unix/write.c index 8c255e11a..284a4755b 100644 --- a/otherlibs/win32unix/write.c +++ b/otherlibs/win32unix/write.c @@ -25,6 +25,7 @@ CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) intnat ofs, len, written; DWORD numbytes, numwritten; char iobuf[UNIX_BUFFER_SIZE]; + DWORD errcode = 0; Begin_root (buf); ofs = Long_val(vofs); @@ -38,22 +39,19 @@ CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) SOCKET s = Socket_val(fd); enter_blocking_section(); ret = send(s, iobuf, numbytes, 0); + if (ret == SOCKET_ERROR) errcode = WSAGetLastError(); 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); + if (! WriteFile(h, iobuf, numbytes, &numwritten, NULL)) + errcode = GetLastError(); leave_blocking_section(); - if (! ret) { - win32_maperr(GetLastError()); - uerror("write", Nothing); - } + } + if (errcode) { + win32_maperr(errcode); + uerror("write", Nothing); } written += numwritten; ofs += numwritten; @@ -81,22 +79,19 @@ CAMLprim value unix_single_write(value fd, value buf, value vofs, value vlen) SOCKET s = Socket_val(fd); enter_blocking_section(); ret = send(s, iobuf, numbytes, 0); + if (ret == SOCKET_ERROR) errcode = WSAGetLastError(); leave_blocking_section(); - if (ret == SOCKET_ERROR) { - win32_maperr(WSAGetLastError()); - uerror("single_write", Nothing); - } numwritten = ret; } else { - BOOL ret; HANDLE h = Handle_val(fd); enter_blocking_section(); - ret = WriteFile(h, iobuf, numbytes, &numwritten, NULL); + if (! WriteFile(h, iobuf, numbytes, &numwritten, NULL)) + errcode = GetLastError(); leave_blocking_section(); - if (! ret) { - win32_maperr(GetLastError()); - uerror("single_write", Nothing); - } + } + if (errcode) { + win32_maperr(errcode); + uerror("single_write", Nothing); } written = numwritten; } |