summaryrefslogtreecommitdiffstats
path: root/otherlibs/win32unix/sendrecv.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2006-10-18 08:17:32 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2006-10-18 08:17:32 +0000
commit741d1e70781e74a523e3a142ec6176422671c8c1 (patch)
treebb654e809b7a5ab6f82a35f3f9bcc4fe3e01cf89 /otherlibs/win32unix/sendrecv.c
parentb74f4b01e790de7c237a74ca12e2972443c81c5b (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.c16
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);