Commit 40491ecc authored by Daniel Walker's avatar Daniel Walker Committed by Alexandre Julliard

Implemented WSAAccept().

parent 404b9a5f
......@@ -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;
}
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment