Implemented WSAAccept().

oldstable
Daniel Walker 2002-01-14 18:33:44 +00:00 committed by Alexandre Julliard
parent 404b9a5fb9
commit 40491ecc62
3 changed files with 88 additions and 3 deletions

View File

@ -3470,3 +3470,63 @@ INT WINAPI WSCDeinstallProvider(LPGUID lpProviderId, LPINT lpErrno)
*lpErrno = 0;
return 0;
}
SOCKET WINAPI WSAAccept( SOCKET s, struct WS_sockaddr *addr, LPINT addrlen,
LPCONDITIONPROC lpfnCondition, DWORD dwCallbackData)
{
int ret = 0, size = 0;
WSABUF CallerId, CallerData, CalleeId, CalleeData;
/* QOS SQOS, GQOS; */
GROUP g;
SOCKET cs;
SOCKADDR s_addr, d_addr;
TRACE("Socket %ui, sockaddr %p, addrlen %p, fnCondition %p, dwCallbackD ata %ld\n",
s, addr, addrlen, lpfnCondition, dwCallbackData);
size = sizeof(s_addr);
cs = WS_accept(s, &s_addr, &size);
if (cs == SOCKET_ERROR) return SOCKET_ERROR;
CallerId.buf = (char *)&s_addr;
CallerId.len = sizeof(s_addr);
CallerData.buf = NULL;
CallerData.len = (ULONG)NULL;
WS_getsockname(cs, &d_addr, &size);
CalleeId.buf = (char *)&d_addr;
CalleeId.len = sizeof(d_addr);
ret = (*lpfnCondition)(&CallerId, &CallerData, NULL, NULL,
&CalleeId, &CalleeData, &g, dwCallbackData);
switch (ret)
{
case CF_ACCEPT:
if (addr && addrlen)
addr = memcpy(addr, &s_addr, (*addrlen > size) ? size : *addrlen );
return cs;
case CF_DEFER:
SetLastError(WSATRY_AGAIN);
return SOCKET_ERROR;
case CF_REJECT:
WS_closesocket(cs);
SetLastError(WSAECONNREFUSED);
return SOCKET_ERROR;
default:
FIXME("Unknown return type from Condition function\n");
SetLastError(WSAENOTSOCK);
return SOCKET_ERROR;
}
SetLastError(WSAENOTSOCK);
return SOCKET_ERROR;
}

View File

@ -38,7 +38,7 @@ debug_channels (winsock)
23 stdcall socket(long long long) WS_socket
24 stdcall WSApSetPostRoutine(ptr) WSApSetPostRoutine
25 stub WPUCompleteOverlappedRequest
26 stub WSAAccept
26 stdcall WSAAccept(long ptr ptr ptr long) WSAAccept
27 stub WSAAddressToStringA
28 stub WSAAddressToStringW
29 stdcall WSACloseEvent(long) WSACloseEvent

View File

@ -226,8 +226,28 @@ typedef unsigned int GROUP;
#define SG_UNCONSTRAINED_GROUP 0x01
#define SG_CONSTRAINED_GROUP 0x02
/* FIXME: We don't yet have qos.h */
typedef DWORD QOS, *LPQOS;
/*
* FLOWSPEC and SERVICETYPE should eventually move to qos.h
*/
typedef ULONG SERVICETYPE;
typedef struct _FLOWSPEC {
unsigned int TokenRate;
unsigned int TokenBucketSize;
unsigned int PeakBandwidth;
unsigned int Latency;
unsigned int DelayVariation;
SERVICETYPE ServiceType;
unsigned int MaxSduSize;
unsigned int MinimumPolicedSize;
} FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC;
typedef struct _QUALITYOFSERVICE {
FLOWSPEC SendingFlowspec;
FLOWSPEC ReceivingFlowspec;
WSABUF ProviderSpecific;
} QOS, *LPQOS;
typedef int CALLBACK (*LPCONDITIONPROC)
(
@ -440,6 +460,11 @@ typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD,const WSAEVENT*,BOOL
#endif /* WS_API_TYPEDEFS */
/* Condition function return values */
#define CF_ACCEPT 0x0000
#define CF_REJECT 0x0001
#define CF_DEFER 0x0002
#include "poppack.h"
#ifdef __cplusplus