WSAAccept
Daniel Walker
diwalker at earthlink.net
Sun Jan 13 09:27:32 CST 2002
winsock/socket.c, winsock/ws2_32.spec, include/winsock2.h
Daniel Walker <diwalker at earthlink.net>
- Implemented WSAAccept()
-------------- next part --------------
? if1632/asmrelay.s
? loader/dos/Makefile
? loader/dos/dosmod
Index: dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.75
diff -u -r1.75 socket.c
--- dlls/winsock/socket.c 2002/01/10 18:18:43 1.75
+++ dlls/winsock/socket.c 2002/01/12 22:01:04
@@ -3470,3 +3470,63 @@
*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;
+}
+
Index: dlls/winsock/ws2_32.spec
===================================================================
RCS file: /home/wine/wine/dlls/winsock/ws2_32.spec,v
retrieving revision 1.14
diff -u -r1.14 ws2_32.spec
--- dlls/winsock/ws2_32.spec 2001/11/14 21:26:23 1.14
+++ dlls/winsock/ws2_32.spec 2002/01/12 22:01:04
@@ -38,7 +38,7 @@
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
Index: include/winsock2.h
===================================================================
RCS file: /home/wine/wine/include/winsock2.h,v
retrieving revision 1.11
diff -u -r1.11 winsock2.h
--- include/winsock2.h 2001/11/14 21:26:24 1.11
+++ include/winsock2.h 2002/01/12 22:01:07
@@ -226,9 +226,29 @@
#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)
(
LPWSABUF lpCallerId,
@@ -439,6 +459,11 @@
typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD,const WSAEVENT*,BOOL,DWORD,BOOL);
#endif /* WS_API_TYPEDEFS */
+
+/* Condition function return values */
+#define CF_ACCEPT 0x0000
+#define CF_REJECT 0x0001
+#define CF_DEFER 0x0002
#include "poppack.h"
More information about the wine-patches
mailing list