Zebediah Figura : ws2_32: Use IOCTL_AFD_WINE_COMPLETE_ASYNC in SIO_UDP_CONNRESET.

Alexandre Julliard julliard at winehq.org
Thu Jun 10 16:04:51 CDT 2021


Module: wine
Branch: master
Commit: e568afa6bd1e8d8a196ec1b59bd26b0794db55a8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e568afa6bd1e8d8a196ec1b59bd26b0794db55a8

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Jun 10 12:36:38 2021 -0500

ws2_32: Use IOCTL_AFD_WINE_COMPLETE_ASYNC in SIO_UDP_CONNRESET.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/socket.c | 98 +++++++---------------------------------------------
 1 file changed, 13 insertions(+), 85 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 5f0d712f5b7..843ec5ba3ab 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -473,8 +473,6 @@ static int ws_protocol_info(SOCKET s, int unicode, WSAPROTOCOL_INFOW *buffer, in
 int WSAIOCTL_GetInterfaceCount(void);
 int WSAIOCTL_GetInterfaceName(int intNumber, char *intName);
 
-static void WS_AddCompletion( SOCKET sock, ULONG_PTR CompletionValue, NTSTATUS CompletionStatus, ULONG Information, BOOL force );
-
 #define MAP_OPTION(opt) { WS_##opt, opt }
 
 static const int ws_sock_map[][2] =
@@ -646,45 +644,6 @@ static UINT wsaErrno(void)
     return sock_get_error( loc_errno );
 }
 
-static NTSTATUS sock_error_to_ntstatus( DWORD err )
-{
-    switch (err)
-    {
-    case 0:                    return STATUS_SUCCESS;
-    case WSAEBADF:             return STATUS_INVALID_HANDLE;
-    case WSAEACCES:            return STATUS_ACCESS_DENIED;
-    case WSAEFAULT:            return STATUS_ACCESS_VIOLATION;
-    case WSAEINVAL:            return STATUS_INVALID_PARAMETER;
-    case WSAEMFILE:            return STATUS_TOO_MANY_OPENED_FILES;
-    case WSAEINPROGRESS:
-    case WSAEWOULDBLOCK:       return STATUS_DEVICE_NOT_READY;
-    case WSAEALREADY:          return STATUS_NETWORK_BUSY;
-    case WSAENOTSOCK:          return STATUS_OBJECT_TYPE_MISMATCH;
-    case WSAEDESTADDRREQ:      return STATUS_INVALID_PARAMETER;
-    case WSAEMSGSIZE:          return STATUS_BUFFER_OVERFLOW;
-    case WSAEPROTONOSUPPORT:
-    case WSAESOCKTNOSUPPORT:
-    case WSAEPFNOSUPPORT:
-    case WSAEAFNOSUPPORT:
-    case WSAEPROTOTYPE:        return STATUS_NOT_SUPPORTED;
-    case WSAENOPROTOOPT:       return STATUS_INVALID_PARAMETER;
-    case WSAEOPNOTSUPP:        return STATUS_NOT_SUPPORTED;
-    case WSAEADDRINUSE:        return STATUS_SHARING_VIOLATION;
-    case WSAEADDRNOTAVAIL:     return STATUS_INVALID_PARAMETER;
-    case WSAECONNREFUSED:      return STATUS_CONNECTION_REFUSED;
-    case WSAESHUTDOWN:         return STATUS_PIPE_DISCONNECTED;
-    case WSAENOTCONN:          return STATUS_INVALID_CONNECTION;
-    case WSAETIMEDOUT:         return STATUS_IO_TIMEOUT;
-    case WSAENETUNREACH:       return STATUS_NETWORK_UNREACHABLE;
-    case WSAENETDOWN:          return STATUS_NETWORK_BUSY;
-    case WSAECONNRESET:        return STATUS_CONNECTION_RESET;
-    case WSAECONNABORTED:      return STATUS_CONNECTION_ABORTED;
-    default:
-        FIXME("unmapped error %u\n", err);
-        return STATUS_UNSUCCESSFUL;
-    }
-}
-
 static DWORD NtStatusToWSAError( NTSTATUS status )
 {
     static const struct
@@ -3224,8 +3183,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
                     DWORD out_size, LPDWORD ret_size, LPWSAOVERLAPPED overlapped,
                     LPWSAOVERLAPPED_COMPLETION_ROUTINE completion )
 {
-    DWORD status = 0, total = 0;
-
     TRACE("%04lx, %s, %p, %d, %p, %d, %p, %p, %p\n",
           s, debugstr_wsaioctl(code), in_buff, in_size, out_buff, out_size, ret_size, overlapped, completion);
 
@@ -3290,7 +3247,7 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
 
     case WS_SIO_ADDRESS_LIST_QUERY:
     {
-        DWORD size;
+        DWORD size, total;
 
         TRACE("-> SIO_ADDRESS_LIST_QUERY request\n");
 
@@ -3483,10 +3440,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
         return ret ? -1 : 0;
     }
 
-   case WS_SIO_UDP_CONNRESET:
-       FIXME("WS_SIO_UDP_CONNRESET stub\n");
-       break;
-
     case WS_SIO_ADDRESS_LIST_CHANGE:
     {
         int force_async = !!overlapped;
@@ -3498,6 +3451,18 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
         return ret ? -1 : 0;
     }
 
+    case WS_SIO_UDP_CONNRESET:
+    {
+        NTSTATUS status = STATUS_SUCCESS;
+        DWORD ret;
+
+        FIXME( "WS_SIO_UDP_CONNRESET stub\n" );
+        ret = server_ioctl_sock( s, IOCTL_AFD_WINE_COMPLETE_ASYNC, &status, sizeof(status),
+                                 NULL, 0, ret_size, overlapped, completion );
+        SetLastError( ret );
+        return ret ? -1 : 0;
+    }
+
     default:
         FIXME( "unimplemented ioctl %s\n", debugstr_wsaioctl( code ) );
         /* fall through */
@@ -3520,27 +3485,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
         return -1;
     }
     }
-
-    if (completion)
-    {
-        FIXME( "completion routine %p not supported\n", completion );
-    }
-    else if (overlapped)
-    {
-        ULONG_PTR cvalue = (overlapped && ((ULONG_PTR)overlapped->hEvent & 1) == 0) ? (ULONG_PTR)overlapped : 0;
-        overlapped->Internal = sock_error_to_ntstatus( status );
-        overlapped->InternalHigh = total;
-        if (cvalue) WS_AddCompletion( HANDLE2SOCKET(s), cvalue, overlapped->Internal, total, FALSE );
-        if (overlapped->hEvent) NtSetEvent( overlapped->hEvent, NULL );
-    }
-
-    if (!status)
-    {
-        *ret_size = total;
-        return 0;
-    }
-    SetLastError( status );
-    return SOCKET_ERROR;
 }
 
 
@@ -3922,22 +3866,6 @@ int WINAPI WSAPoll(WSAPOLLFD *wfds, ULONG count, int timeout)
     return ret;
 }
 
-/* helper to send completion messages for client-only i/o operation case */
-static void WS_AddCompletion( SOCKET sock, ULONG_PTR CompletionValue, NTSTATUS CompletionStatus,
-                              ULONG Information, BOOL async )
-{
-    SERVER_START_REQ( add_fd_completion )
-    {
-        req->handle      = wine_server_obj_handle( SOCKET2HANDLE(sock) );
-        req->cvalue      = CompletionValue;
-        req->status      = CompletionStatus;
-        req->information = Information;
-        req->async       = async;
-        wine_server_call( req );
-    }
-    SERVER_END_REQ;
-}
-
 
 /***********************************************************************
  *		send			(WS2_32.19)




More information about the wine-cvs mailing list