Implemented WSAAccept().
This commit is contained in:
parent
404b9a5fb9
commit
40491ecc62
|
@ -3470,3 +3470,63 @@ INT WINAPI WSCDeinstallProvider(LPGUID lpProviderId, LPINT lpErrno)
|
||||||
*lpErrno = 0;
|
*lpErrno = 0;
|
||||||
return 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
|
23 stdcall socket(long long long) WS_socket
|
||||||
24 stdcall WSApSetPostRoutine(ptr) WSApSetPostRoutine
|
24 stdcall WSApSetPostRoutine(ptr) WSApSetPostRoutine
|
||||||
25 stub WPUCompleteOverlappedRequest
|
25 stub WPUCompleteOverlappedRequest
|
||||||
26 stub WSAAccept
|
26 stdcall WSAAccept(long ptr ptr ptr long) WSAAccept
|
||||||
27 stub WSAAddressToStringA
|
27 stub WSAAddressToStringA
|
||||||
28 stub WSAAddressToStringW
|
28 stub WSAAddressToStringW
|
||||||
29 stdcall WSACloseEvent(long) WSACloseEvent
|
29 stdcall WSACloseEvent(long) WSACloseEvent
|
||||||
|
|
|
@ -226,8 +226,28 @@ typedef unsigned int GROUP;
|
||||||
#define SG_UNCONSTRAINED_GROUP 0x01
|
#define SG_UNCONSTRAINED_GROUP 0x01
|
||||||
#define SG_CONSTRAINED_GROUP 0x02
|
#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)
|
typedef int CALLBACK (*LPCONDITIONPROC)
|
||||||
(
|
(
|
||||||
|
@ -440,6 +460,11 @@ typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD,const WSAEVENT*,BOOL
|
||||||
#endif /* WS_API_TYPEDEFS */
|
#endif /* WS_API_TYPEDEFS */
|
||||||
|
|
||||||
|
|
||||||
|
/* Condition function return values */
|
||||||
|
#define CF_ACCEPT 0x0000
|
||||||
|
#define CF_REJECT 0x0001
|
||||||
|
#define CF_DEFER 0x0002
|
||||||
|
|
||||||
#include "poppack.h"
|
#include "poppack.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue