diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1997-09-02 16:01:39 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1997-09-02 16:01:39 +0000 |
commit | 88054d9a9863b6f41b2c42583145e6689752e5f9 (patch) | |
tree | 3a05c37b4a16307caa922e731b74a71816d58b90 /otherlibs/win32unix/sendrecv.c | |
parent | 4c8f23357d3d77ae7683a9ccb7a60ca22e231bf7 (diff) |
MAJ portage Win32
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1698 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/win32unix/sendrecv.c')
-rw-r--r-- | otherlibs/win32unix/sendrecv.c | 75 |
1 files changed, 45 insertions, 30 deletions
diff --git a/otherlibs/win32unix/sendrecv.c b/otherlibs/win32unix/sendrecv.c index 74e1965ad..a1818a478 100644 --- a/otherlibs/win32unix/sendrecv.c +++ b/otherlibs/win32unix/sendrecv.c @@ -21,69 +21,84 @@ static int msg_flag_table[] = { MSG_OOB, MSG_DONTROUTE, MSG_PEEK }; -value unix_recv(sock, buff, ofs, len, flags) /* ML */ - value sock, buff, ofs, len, flags; +value unix_recv(value sock, value buff, value ofs, value len, value flags) { int ret; - buff = unix_freeze_buffer(buff); - enter_blocking_section(); - ret = recv((SOCKET) _get_osfhandle(Int_val(sock)), - &Byte(buff, Long_val(ofs)), Int_val(len), - convert_flag_list(flags, msg_flag_table)); - leave_blocking_section(); - if (ret == -1) uerror("recv", Nothing); + long numbytes; + char iobuf[UNIX_BUFFER_SIZE]; + + Begin_root (buff); + numbytes = Long_val(len); + if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; + enter_blocking_section(); + ret = recv((SOCKET) _get_osfhandle(Int_val(sock)), iobuf, (int) numbytes, + convert_flag_list(flags, msg_flag_table)); + leave_blocking_section(); + if (ret == -1) uerror("recv", Nothing); + bcopy(iobuf, &Byte(buff, Long_val(ofs)), ret); + End_roots(); return Val_int(ret); } -value unix_recvfrom(sock, buff, ofs, len, flags) /* ML */ - value sock, buff, ofs, len, flags; +value unix_recvfrom(value sock, value buff, value ofs, value len, value flags) /* ML */ { - int retcode; + int ret; + long numbytes; + char iobuf[UNIX_BUFFER_SIZE]; value res; value adr = Val_unit; - Begin_root (adr); - buff = unix_freeze_buffer(buff); /* XXX Xavier regarde ca */ + Begin_roots2 (buff, adr); + numbytes = Long_val(len); + if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; sock_addr_len = sizeof(sock_addr); enter_blocking_section(); - retcode = recvfrom((SOCKET) _get_osfhandle(Int_val(sock)), - &Byte(buff, Long_val(ofs)), Int_val(len), - convert_flag_list(flags, msg_flag_table), - &sock_addr.s_gen, &sock_addr_len); + ret = recvfrom((SOCKET) _get_osfhandle(Int_val(sock)), + iobuf, (int) numbytes, + convert_flag_list(flags, msg_flag_table), + &sock_addr.s_gen, &sock_addr_len); leave_blocking_section(); - if (retcode == -1) uerror("recvfrom", Nothing); + if (ret == -1) uerror("recvfrom", Nothing); + bcopy(iobuf, &Byte(buff, Long_val(ofs)), ret); adr = alloc_sockaddr(); res = alloc_tuple(2); - Field(res, 0) = Val_int(retcode); + Field(res, 0) = Val_int(ret); Field(res, 1) = adr; End_roots(); return res; } -value unix_send(sock, buff, ofs, len, flags) /* ML */ - value sock, buff, ofs, len, flags; +value unix_send(value sock, value buff, value ofs, value len, value flags) /* ML */ { int ret; - buff = unix_freeze_buffer(buff); + long numbytes; + char iobuf[UNIX_BUFFER_SIZE]; + + numbytes = Long_val(len); + if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; + bcopy(&Byte(buff, Long_val(ofs)), iobuf, numbytes); enter_blocking_section(); - ret = send((SOCKET) _get_osfhandle(Int_val(sock)), - &Byte(buff, Long_val(ofs)), Int_val(len), + ret = send((SOCKET) _get_osfhandle(Int_val(sock)), iobuf, (int) numbytes, convert_flag_list(flags, msg_flag_table)); leave_blocking_section(); if (ret == -1) uerror("send", Nothing); return Val_int(ret); } -value unix_sendto_native(sock, buff, ofs, len, flags, dest) - value sock, buff, ofs, len, flags, dest; +value unix_sendto_native(value sock, value buff, value ofs, value len, value flags, value dest) { int ret; + long numbytes; + char iobuf[UNIX_BUFFER_SIZE]; + get_sockaddr(dest); - buff = unix_freeze_buffer(buff); + numbytes = Long_val(len); + if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE; + bcopy(&Byte(buff, Long_val(ofs)), iobuf, numbytes); enter_blocking_section(); ret = sendto((SOCKET) _get_osfhandle(Int_val(sock)), - &Byte(buff, Long_val(ofs)), - Int_val(len), convert_flag_list(flags, msg_flag_table), + iobuf, (int) numbytes, + convert_flag_list(flags, msg_flag_table), &sock_addr.s_gen, sock_addr_len); leave_blocking_section(); if (ret == -1) uerror("sendto", Nothing); |