Ignore:
Timestamp:
May 6, 2002, 11:38:52 AM (23 years ago)
Author:
sandervl
Message:

added WSAAccept

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ws2_32/socket.cpp

    r8051 r8370  
    1 /* $Id: socket.cpp,v 1.12 2002-03-08 11:36:11 sandervl Exp $ */
     1/* $Id: socket.cpp,v 1.13 2002-05-06 09:38:52 sandervl Exp $ */
    22/*
    33 * based on Windows Sockets 1.1 specs
     
    105105   return ( socket (af, type, protocol) );
    106106}
     107/***********************************************************************
     108 *              WSAAccept                        (WS2_32.26)
     109 */
     110SOCKET WINAPI WSAAccept( SOCKET s, struct WS_sockaddr *addr, LPINT addrlen,
     111               LPCONDITIONPROC lpfnCondition, DWORD dwCallbackData)
     112{
     113
     114       int ret = 0, size = 0;
     115       WSABUF CallerId, CallerData, CalleeId, CalleeData;
     116       /*        QOS SQOS, GQOS; */
     117       GROUP g;
     118       SOCKET cs;
     119       SOCKADDR src_addr, dst_addr;
     120
     121       TRACE("Socket  %u, sockaddr %p, addrlen %p, fnCondition %p, dwCallbackData %ld\n",
     122               s, addr, addrlen, lpfnCondition, dwCallbackData);
     123
     124       
     125       size = sizeof(src_addr);
     126       cs = accept(s, &src_addr, &size);
     127       
     128       if (cs == SOCKET_ERROR) return SOCKET_ERROR;
     129
     130       CallerId.buf = (char *)&src_addr;
     131       CallerId.len = sizeof(src_addr); 
     132
     133       CallerData.buf = NULL;
     134       CallerData.len = (ULONG)NULL;   
     135
     136       getsockname(cs, &dst_addr, &size);
     137
     138       CalleeId.buf = (char *)&dst_addr;
     139       CalleeId.len = sizeof(dst_addr); 
     140       
     141       ret = (*lpfnCondition)(&CallerId, &CallerData, NULL, NULL,
     142                       &CalleeId, &CalleeData, &g, dwCallbackData);
     143
     144       switch (ret)
     145       {
     146               case CF_ACCEPT:
     147                       if (addr && addrlen)
     148                               addr = (struct WS_sockaddr *)memcpy(addr, &src_addr, (*addrlen > size) ?  size : *addrlen );
     149                       return cs;
     150               case CF_DEFER:
     151                       SetLastError(WSATRY_AGAIN);
     152                       return SOCKET_ERROR;
     153               case CF_REJECT:
     154                       closesocket(cs);
     155                       SetLastError(WSAECONNREFUSED);
     156                       return SOCKET_ERROR;
     157               default:
     158                       FIXME("Unknown return type from Condition function\n");
     159                       SetLastError(WSAENOTSOCK);
     160                       return SOCKET_ERROR;
     161               }
     162
     163       SetLastError(WSAENOTSOCK);
     164       return SOCKET_ERROR;
     165}
    107166//******************************************************************************
    108167//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.