Jon Griffiths : mswsock: Implement 3 functions by calling through SIO_GET_EXTENSION_FUNCTION_POINTER .

Alexandre Julliard julliard at winehq.org
Wed Jul 16 13:33:06 CDT 2008


Module: wine
Branch: master
Commit: 2da98052d90591474c65bed853ca75e1da714823
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2da98052d90591474c65bed853ca75e1da714823

Author: Jon Griffiths <jon_p_griffiths at yahoo.com>
Date:   Sun Jul 13 12:22:33 2008 -0700

mswsock: Implement 3 functions by calling through SIO_GET_EXTENSION_FUNCTION_POINTER.

---

 dlls/mswsock/mswsock.c |  168 ++++++++++++++++++++++++++++-------------------
 1 files changed, 100 insertions(+), 68 deletions(-)

diff --git a/dlls/mswsock/mswsock.c b/dlls/mswsock/mswsock.c
index bdf4d30..e82f2e3 100644
--- a/dlls/mswsock/mswsock.c
+++ b/dlls/mswsock/mswsock.c
@@ -31,95 +31,127 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mswsock);
 
+static LPFN_ACCEPTEX acceptex_fn;
+static LPFN_GETACCEPTEXSOCKADDRS acceptexsockaddrs_fn;
+static LPFN_TRANSMITFILE transmitfile_fn;
+static BOOL initialised;
+
+/* Get pointers to the ws2_32 implementations.
+ * NOTE: This assumes that ws2_32 contains only one implementation
+ * of these functions, i.e. that you cannot get different functions
+ * back by passing another socket in. If that ever changes, we'll need
+ * to think about associating the functions with the socket and
+ * exposing that information to this dll somehow.
+ */
+static void get_fn(SOCKET s, GUID* guid, FARPROC* fn)
+{
+    FARPROC func;
+    DWORD len;
+    if (!WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, guid, sizeof(*guid),
+                  &func, sizeof(func), &len, NULL, NULL))
+        *fn = func;
+}
+
+static void get_fn_pointers(SOCKET s)
+{
+    GUID acceptex_guid = WSAID_ACCEPTEX;
+    GUID acceptexsockaddrs_guid = WSAID_GETACCEPTEXSOCKADDRS;
+    GUID transmitfile_guid = WSAID_TRANSMITFILE;
+
+    get_fn(s, &acceptex_guid, (FARPROC*)&acceptex_fn);
+    get_fn(s, &acceptexsockaddrs_guid, (FARPROC*)&acceptexsockaddrs_fn);
+    get_fn(s, &transmitfile_guid, (FARPROC*)&transmitfile_fn);
+    initialised = TRUE;
+}
+
 /***********************************************************************
  *		AcceptEx (MSWSOCK.@)
  *
- * This function is used to accept a new connection, get the local and remote
- * address, and receive the initial block of data sent by the client.
+ * Accept a new connection, retrieving the connected addresses and initial data.
  *
- * TODO
- *  This function is currently implemented as a stub.
+ * listener       [I] Listening socket
+ * acceptor       [I] Socket to accept on
+ * dest           [O] Destination for inital data
+ * dest_len       [I] Size of dest in bytes
+ * local_addr_len [I] Number of bytes reserved in dest for local addrress
+ * rem_addr_len   [I] Number of bytes reserved in dest for remote addrress
+ * received       [O] Destination for number of bytes of initial data
+ * overlapped     [I] For asynchronous execution
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE. Use WSAGetLastError() for details of the error.
  */
-
-BOOL WINAPI AcceptEx(
-	SOCKET sListenSocket, /* [in] Descriptor identifying a socket that 
-                                 has already been called with the listen
-                                 function */
-	SOCKET sAcceptSocket, /* [in] Descriptor identifying a socket on 
-                                 which to accept an incoming connection */
-	PVOID lpOutputBuffer, /* [in]  Pointer to a buffer */
-	DWORD dwReceiveDataLength, /* [in] Number of bytes in lpOutputBuffer
-				      that will be used for actual receive data
-				      at the beginning of the buffer */
-	DWORD dwLocalAddressLength, /* [in] Number of bytes reserved for the
-				       local address information */
-	DWORD dwRemoteAddressLength, /* [in] Number of bytes reserved for the
-					remote address information */
-	LPDWORD lpdwBytesReceived, /* [out] Pointer to a DWORD that receives
-				      the count of bytes received */
-	LPOVERLAPPED lpOverlapped) /* [in] Specify in order to achieve an 
-                                      overlapped (asynchronous) I/O 
-                                      operation */
+BOOL WINAPI AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DWORD dest_len,
+                     DWORD local_addr_len, DWORD rem_addr_len, LPDWORD received,
+                     LPOVERLAPPED overlapped)
 {
-    FIXME("(listen=%ld, accept=%ld, %p, %d, %d, %d, %p, %p), not implemented\n",
-	sListenSocket,sAcceptSocket,lpOutputBuffer,dwReceiveDataLength,
-	dwLocalAddressLength,dwRemoteAddressLength,lpdwBytesReceived,lpOverlapped
-    );
-    return FALSE;
+    if (!initialised)
+        get_fn_pointers(acceptor);
+
+    if (!acceptex_fn)
+        return FALSE;
+
+    return acceptex_fn(listener, acceptor, dest, dest_len, local_addr_len,
+                       rem_addr_len, received, overlapped);
 }
 
 /***********************************************************************
  *		GetAcceptExSockaddrs (MSWSOCK.@)
+ *
+ * Get infomation about an accepted socket.
+ *
+ * data           [O] Destination for the first block of data from AcceptEx()
+ * data_len       [I] length of data in bytes
+ * local_len      [I] Bytes reserved for local addrinfo
+ * rem_len        [I] Bytes reserved for remote addrinfo
+ * local_addr     [O] Destination for local sockaddr
+ * local_addr_len [I] Size of local_addr
+ * rem_addr       [O] Destination for remote sockaddr
+ * rem_addr_len   [I] Size of rem_addr
+ *
+ * RETURNS
+ *  Nothing.
  */
-VOID WINAPI GetAcceptExSockaddrs(
-	PVOID lpOutputBuffer, /* [in] Pointer to a buffer */
-	DWORD dwReceiveDataLength, /* [in] Number of bytes in the buffer used
-				      for receiving the first data */
-	DWORD dwLocalAddressLength, /* [in] Number of bytes reserved for the
-				       local address information */
-	DWORD dwRemoteAddressLength, /* [in] Number of bytes reserved for the
-					remote address information */
-	struct sockaddr **LocalSockaddr, /* [out] Pointer to the sockaddr
-					    structure that receives the local
-					    address of the connection  */
-	LPINT LocalSockaddrLength, /* [out] Size in bytes of the local
-				      address */
-	struct sockaddr **RemoteSockaddr, /* [out] Pointer to the sockaddr
-					     structure that receives the remote
-					     address of the connection */
-	LPINT RemoteSockaddrLength) /* [out] Size in bytes of the remote address */
+VOID WINAPI GetAcceptExSockaddrs(PVOID data, DWORD data_len, DWORD local_len, DWORD rem_len,
+                                 struct sockaddr **local_addr, LPINT local_addr_len,
+                                 struct sockaddr **rem_addr, LPINT rem_addr_len)
 {
-    FIXME("not implemented\n");
+    if (acceptexsockaddrs_fn)
+        acceptexsockaddrs_fn(data, data_len, local_len, rem_len,
+                             local_addr, local_addr_len, rem_addr, rem_addr_len);
 }
 
+
 /***********************************************************************
  *		TransmitFile (MSWSOCK.@)
  *
- * This function is used to transmit a file over socket.
+ * Transmit a file over a socket.
+ *
+ * PARAMS
+ * s          [I] Handle to a connected socket
+ * file       [I] Opened file handle for file to send
+ * total_len  [I] Total number of file bytes to send
+ * chunk_len  [I] Chunk size to send file in (0=default)
+ * overlapped [I] For asynchronous operation
+ * buffers    [I] Head/tail data, or NULL if none
+ * flags      [I] TF_ Flags from mswsock.h
  *
- * TODO
- *  This function is currently implemented as a stub.
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE. Use WSAGetLastError() for details of the error.
  */
-
-BOOL WINAPI TransmitFile(
-        SOCKET hSocket, /* [in] Handle to a connected socket */
-	HANDLE hFile,   /* [in] Handle to the open file that should be
-                           transmitted */
-	DWORD nNumberOfBytesToWrite, /* [in] Number of file bytes to 
-                                        transmit */
-	DWORD nNumberOfBytesPerSend, /* [in] Size in bytes of each block of
-                                         data sent in each send operation */
-	LPOVERLAPPED lpOverlapped, /* [in] Specify in order to achieve an 
-                                      overlapped (asynchronous) I/O 
-                                      operation */
-	LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, 
-		/* [in] Contains pointers to data to send before and after
-                   the file data is sent */
-	DWORD dwFlags) /* [in] Flags */
+BOOL WINAPI TransmitFile(SOCKET s, HANDLE file, DWORD total_len,
+                         DWORD chunk_len, LPOVERLAPPED overlapped,
+                         LPTRANSMIT_FILE_BUFFERS buffers, DWORD flags)
 {
-    FIXME("not implemented\n");
+    if (!initialised)
+        get_fn_pointers(s);
+
+    if (!transmitfile_fn)
+        return FALSE;
 
-    return FALSE;
+    return transmitfile_fn(s, file, total_len, chunk_len, overlapped, buffers, flags);
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list