diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1999-02-24 14:28:23 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1999-02-24 14:28:23 +0000 |
commit | 6fb83c93fcf5a7687ebaf084daf3933ff23c22e9 (patch) | |
tree | f96b3483c79713502b609a5c947be2ced247edf2 /otherlibs/win32unix/accept.c | |
parent | f735038ef693c1130eaed94e81cdeceeabdd8b16 (diff) |
Ajout de Unix.async_socket (a tester)
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@2303 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/win32unix/accept.c')
-rw-r--r-- | otherlibs/win32unix/accept.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/otherlibs/win32unix/accept.c b/otherlibs/win32unix/accept.c index 10b0f7b1a..b55693ffa 100644 --- a/otherlibs/win32unix/accept.c +++ b/otherlibs/win32unix/accept.c @@ -23,17 +23,25 @@ value unix_accept(sock) /* ML */ SOCKET sconn = (SOCKET) Handle_val(sock); SOCKET snew; value fd = Val_unit, adr = Val_unit, res; - int optionValue; - - /* Set sockets to synchronous mode */ - optionValue = SO_SYNCHRONOUS_NONALERT; - setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, - (char *)&optionValue, sizeof(optionValue)); + int oldvalue, newvalue, retcode; + retcode = getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + (char *) &oldvalue, sizeof(oldvalue)); + if (retcode == 0) { + /* Set sockets to synchronous mode */ + newvalue = SO_SYNCHRONOUS_NONALERT; + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + (char *) &newvalue, sizeof(newvalue)); + } sock_addr_len = sizeof(sock_addr); enter_blocking_section(); snew = accept(sconn, &sock_addr.s_gen, &sock_addr_len); leave_blocking_section(); + if (retcode == 0) { + /* Restore initial mode */ + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + (char *) &oldvalue, sizeof(oldvalue)); + } if (snew == INVALID_SOCKET) unix_error(WSAGetLastError(), "accept", Nothing); Begin_roots2 (fd, adr) |