diff options
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); |