From 6fb83c93fcf5a7687ebaf084daf3933ff23c22e9 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Wed, 24 Feb 1999 14:28:23 +0000 Subject: Ajout de Unix.async_socket (a tester) git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@2303 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- otherlibs/win32unix/socket.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'otherlibs/win32unix/socket.c') diff --git a/otherlibs/win32unix/socket.c b/otherlibs/win32unix/socket.c index cdcd34a6d..c543bcf88 100644 --- a/otherlibs/win32unix/socket.c +++ b/otherlibs/win32unix/socket.c @@ -24,20 +24,28 @@ int socket_type_table[] = { SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET }; -value unix_socket(domain, type, proto) /* ML */ +value unix_socket(domain, type, proto, synchronous) /* ML */ value domain, type, proto; { SOCKET s; - 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 or asnychronous mode, as requested */ + newvalue = Bool_val(synchronous) ? SO_SYNCHRONOUS_NONALERT : 0; + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + (char *) &newvalue, sizeof(newvalue)); + } s = socket(socket_domain_table[Int_val(domain)], socket_type_table[Int_val(type)], Int_val(proto)); + if (retcode == 0) { + /* Restore initial mode */ + setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, + (char *) &oldvalue, sizeof(oldvalue)); + } if (s == INVALID_SOCKET) unix_error(WSAGetLastError(), "socket", Nothing); return win_alloc_handle((HANDLE) s); } -- cgit v1.2.3-70-g09d2