Source

ocaml / otherlibs / win32unix / accept.c

xleroy 97fb777 

doligez 6cd742a 
xleroy 97fb777 



xleroy 06a1e11 
xleroy 0357d04 

xleroy 97fb777 







xleroy 03bd357 
xleroy 97fb777 
frisch 9cc8769 
xleroy 97fb777 

xleroy 9eaedc5 
xleroy 33a560a 
xleroy 97fb777 
xleroy b0a3255 
xleroy 732b5d2 

doligez c61fd90 
xleroy ec6f393 

xleroy 8395973 
doligez 55d06b6 
doligez c61fd90 








xleroy ec6f393 
xleroy 732b5d2 
xleroy ec6f393 
xleroy 8395973 
xleroy 732b5d2 
doligez c61fd90 




xleroy 580734e 
xleroy 8395973 
xleroy 580734e 

xleroy 732b5d2 
xleroy b0a3255 
doligez 7d56c59 
doligez 3ed6f24 
xleroy 732b5d2 
doligez 55d06b6 

xleroy 97fb777 
/***********************************************************************/
/*                                                                     */
/*                                OCaml                                */
/*                                                                     */
/*            Xavier Leroy, projet Cristal, INRIA Rocquencourt         */
/*                                                                     */
/*  Copyright 1996 Institut National de Recherche en Informatique et   */
/*  en Automatique.  All rights reserved.  This file is distributed    */
/*  under the terms of the GNU Library General Public License, with    */
/*  the special exception on linking described in file ../../LICENSE.  */
/*                                                                     */
/***********************************************************************/

/* $Id$ */

#include <mlvalues.h>
#include <alloc.h>
#include <memory.h>
#include <signals.h>
#include "unixsupport.h"
#include <mswsock.h>   // for SO_OPENTYPE and SO_SYNCHRONOUS_NONALERT
#include "socketaddr.h"

CAMLprim value unix_accept(sock)
     value sock;
{
  SOCKET sconn = Socket_val(sock);
  SOCKET snew;
  value fd = Val_unit, adr = Val_unit, res;
  int oldvalue, oldvaluelen, newvalue, retcode;
  union sock_addr_union addr;
  socklen_param_type addr_len;
  DWORD err = 0;

  oldvaluelen = sizeof(oldvalue);
  retcode = getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
                       (char *) &oldvalue, &oldvaluelen);
  if (retcode == 0) {
    /* Set sockets to synchronous mode */
    newvalue = SO_SYNCHRONOUS_NONALERT;
    setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
               (char *) &newvalue, sizeof(newvalue));
  }
  addr_len = sizeof(sock_addr);
  enter_blocking_section();
  snew = accept(sconn, &addr.s_gen, &addr_len);
  if (snew == INVALID_SOCKET) err = WSAGetLastError ();
  leave_blocking_section();
  if (retcode == 0) {
    /* Restore initial mode */
    setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
               (char *) &oldvalue, oldvaluelen);
  }
  if (snew == INVALID_SOCKET) {
    win32_maperr(err);
    uerror("accept", Nothing);
  }
  Begin_roots2 (fd, adr)
    fd = win_alloc_socket(snew);
    adr = alloc_sockaddr(&addr, addr_len, snew);
    res = alloc_small(2, 0);
    Field(res, 0) = fd;
    Field(res, 1) = adr;
  End_roots();
  return res;
}