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/sendrecv.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/sendrecv.c')
-rw-r--r-- | otherlibs/win32unix/sendrecv.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/otherlibs/win32unix/sendrecv.c b/otherlibs/win32unix/sendrecv.c index 7359feb58..d820f5d0b 100644 --- a/otherlibs/win32unix/sendrecv.c +++ b/otherlibs/win32unix/sendrecv.c @@ -31,15 +31,17 @@ CAMLprim value unix_recv(value sock, value buff, value ofs, value len, value fla int ret; intnat numbytes; char iobuf[UNIX_BUFFER_SIZE]; + DWORD errcode = 0; Begin_root (buff); numbytes = Long_val(len); if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; enter_blocking_section(); ret = recv(s, iobuf, (int) numbytes, flg); + if (ret == -1) errcode = WSAGetLastError(); leave_blocking_section(); if (ret == -1) { - win32_maperr(WSAGetLastError()); + win32_maperr(errcode); uerror("recv", Nothing); } memmove (&Byte(buff, Long_val(ofs)), iobuf, ret); @@ -58,6 +60,7 @@ CAMLprim value unix_recvfrom(value sock, value buff, value ofs, value len, value value adr = Val_unit; union sock_addr_union addr; socklen_param_type addr_len; + DWORD errcode = 0; Begin_roots2 (buff, adr); numbytes = Long_val(len); @@ -65,9 +68,10 @@ CAMLprim value unix_recvfrom(value sock, value buff, value ofs, value len, value addr_len = sizeof(sock_addr); enter_blocking_section(); ret = recvfrom(s, iobuf, (int) numbytes, flg, &addr.s_gen, &addr_len); + if (ret == -1) errcode = WSAGetLastError(); leave_blocking_section(); if (ret == -1) { - win32_maperr(WSAGetLastError()); + win32_maperr(errcode); uerror("recvfrom", Nothing); } memmove (&Byte(buff, Long_val(ofs)), iobuf, ret); @@ -86,15 +90,17 @@ CAMLprim value unix_send(value sock, value buff, value ofs, value len, value fla int ret; intnat numbytes; char iobuf[UNIX_BUFFER_SIZE]; + DWORD errcode = 0; numbytes = Long_val(len); if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; memmove (iobuf, &Byte(buff, Long_val(ofs)), numbytes); enter_blocking_section(); ret = send(s, iobuf, (int) numbytes, flg); + if (ret == -1) errcode = WSAGetLastError(); leave_blocking_section(); if (ret == -1) { - win32_maperr(WSAGetLastError()); + win32_maperr(errcode); uerror("send", Nothing); } return Val_int(ret); @@ -109,6 +115,7 @@ value unix_sendto_native(value sock, value buff, value ofs, value len, value fla char iobuf[UNIX_BUFFER_SIZE]; union sock_addr_union addr; socklen_param_type addr_len; + DWORD errcode = 0; get_sockaddr(dest, &addr, &addr_len); numbytes = Long_val(len); @@ -116,9 +123,10 @@ value unix_sendto_native(value sock, value buff, value ofs, value len, value fla memmove (iobuf, &Byte(buff, Long_val(ofs)), numbytes); enter_blocking_section(); ret = sendto(s, iobuf, (int) numbytes, flg, &addr.s_gen, addr_len); + if (ret == -1) errcode = WSAGetLastError(); leave_blocking_section(); if (ret == -1) { - win32_maperr(WSAGetLastError()); + win32_maperr(errcode); uerror("sendto", Nothing); } return Val_int(ret); |