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