Zebediah Figura : ws2_32: Use IOCTL_AFD_WINE_SHUTDOWN in WS_shutdown().
Alexandre Julliard
julliard at winehq.org
Wed May 19 14:55:13 CDT 2021
Module: wine
Branch: master
Commit: 53dc1b0a58d6f30029a1f517bc9efce048bde229
URL: https://source.winehq.org/git/wine.git/?a=commit;h=53dc1b0a58d6f30029a1f517bc9efce048bde229
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Tue May 18 22:35:51 2021 -0500
ws2_32: Use IOCTL_AFD_WINE_SHUTDOWN in WS_shutdown().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/socket.c | 130 ++++-------------------------------------------
dlls/ws2_32/tests/sock.c | 20 ++++----
2 files changed, 21 insertions(+), 129 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 0110d53ab48..3632397ef3d 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2272,64 +2272,6 @@ static NTSTATUS WS2_async_send( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS stat
return status;
}
-/***********************************************************************
- * WS2_async_shutdown (INTERNAL)
- *
- * Handler for shutdown() operations on overlapped sockets.
- */
-static NTSTATUS WS2_async_shutdown( void *user, IO_STATUS_BLOCK *iosb, NTSTATUS status )
-{
- struct ws2_async_shutdown *wsa = user;
- int fd, err = 1;
-
- switch (status)
- {
- case STATUS_ALERTED:
- if ((status = wine_server_handle_to_fd( wsa->hSocket, 0, &fd, NULL ) ))
- break;
-
- switch ( wsa->type )
- {
- case ASYNC_TYPE_READ: break;
- case ASYNC_TYPE_WRITE: err = shutdown( fd, 1 ); break;
- }
- status = err ? wsaErrStatus() : STATUS_SUCCESS;
- close( fd );
- break;
- }
- iosb->u.Status = status;
- iosb->Information = 0;
- release_async_io( &wsa->io );
- return status;
-}
-
-/***********************************************************************
- * WS2_register_async_shutdown (INTERNAL)
- *
- * Helper function for WS_shutdown() on overlapped sockets.
- */
-static int WS2_register_async_shutdown( SOCKET s, int type )
-{
- struct ws2_async_shutdown *wsa;
- NTSTATUS status;
-
- TRACE("socket %04lx type %d\n", s, type);
-
- wsa = (struct ws2_async_shutdown *)alloc_async_io( sizeof(*wsa), WS2_async_shutdown );
- if ( !wsa )
- return WSAEFAULT;
-
- wsa->hSocket = SOCKET2HANDLE(s);
- wsa->type = type;
-
- status = register_async( type, wsa->hSocket, &wsa->io, 0, NULL, NULL, &wsa->iosb );
- if (status != STATUS_PENDING)
- {
- HeapFree( GetProcessHeap(), 0, wsa );
- return NtStatusToWSAError( status );
- }
- return 0;
-}
/***********************************************************************
* accept (WS2_32.1)
@@ -5512,74 +5454,24 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
return SOCKET_ERROR;
}
+
/***********************************************************************
- * shutdown (WS2_32.22)
+ * shutdown (ws2_32.22)
*/
-int WINAPI WS_shutdown(SOCKET s, int how)
+int WINAPI WS_shutdown( SOCKET s, int how )
{
- int fd, err = WSAENOTSOCK;
- unsigned int options = 0, clear_flags = 0;
-
- fd = get_sock_fd( s, 0, &options );
- TRACE("socket %04lx, how 0x%x, options 0x%x\n", s, how, options );
-
- if (fd == -1)
- return SOCKET_ERROR;
-
- switch( how )
- {
- case SD_RECEIVE: /* drop receives */
- clear_flags |= FD_READ;
- break;
- case SD_SEND: /* drop sends */
- clear_flags |= FD_WRITE;
- break;
- case SD_BOTH: /* drop all */
- clear_flags |= FD_READ|FD_WRITE;
- /*fall through */
- default:
- clear_flags |= FD_WINE_LISTENING;
- }
-
- if (!(options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)))
- {
- switch ( how )
- {
- case SD_RECEIVE:
- err = WS2_register_async_shutdown( s, ASYNC_TYPE_READ );
- break;
- case SD_SEND:
- err = WS2_register_async_shutdown( s, ASYNC_TYPE_WRITE );
- break;
- case SD_BOTH:
- default:
- err = WS2_register_async_shutdown( s, ASYNC_TYPE_READ );
- if (!err) err = WS2_register_async_shutdown( s, ASYNC_TYPE_WRITE );
- break;
- }
- if (err) goto error;
- }
- else /* non-overlapped mode */
- {
- if (how != SD_RECEIVE && shutdown( fd, SHUT_WR ))
- {
- err = wsaErrno();
- goto error;
- }
- }
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
- release_sock_fd( s, fd );
- _enable_event( SOCKET2HANDLE(s), 0, 0, clear_flags );
- if ( how > 1) WSAAsyncSelect( s, 0, 0, 0 );
- return 0;
+ TRACE( "socket %#lx, how %u\n", s, how );
-error:
- release_sock_fd( s, fd );
- _enable_event( SOCKET2HANDLE(s), 0, 0, clear_flags );
- SetLastError( err );
- return SOCKET_ERROR;
+ status = NtDeviceIoControlFile( (HANDLE)s, NULL, NULL, NULL, &io,
+ IOCTL_AFD_WINE_SHUTDOWN, &how, sizeof(how), NULL, 0 );
+ SetLastError( NtStatusToWSAError( status ) );
+ return status ? -1 : 0;
}
+
/***********************************************************************
* socket (WS2_32.23)
*/
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 2c1f0e6142a..8bec781ac6f 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -6405,12 +6405,12 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = shutdown(client, SD_SEND);
ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
WSASetLastError(0xdeadbeef);
ret = shutdown(client, SD_RECEIVE);
ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
ret = connect(client, (struct sockaddr *)&server_addr, sizeof(server_addr));
ok(!ret, "failed to connect, error %u\n", WSAGetLastError());
@@ -6425,8 +6425,8 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = shutdown(client, SD_SEND);
- todo_wine ok(!ret, "expected success\n");
- todo_wine ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
+ ok(!ret, "expected success\n");
+ ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
WSASetLastError(0xdeadbeef);
ret = send(client, "test", 5, 0);
@@ -6501,7 +6501,7 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = shutdown(client, 0xdeadbeef);
ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
closesocket(client);
closesocket(server);
@@ -6628,12 +6628,12 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = shutdown(listener, SD_SEND);
ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
WSASetLastError(0xdeadbeef);
ret = shutdown(listener, SD_RECEIVE);
- todo_wine ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
+ ok(ret == -1, "expected failure\n");
+ ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
closesocket(listener);
@@ -6671,8 +6671,8 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = shutdown(client, SD_SEND);
- todo_wine ok(!ret, "expected success\n");
- todo_wine ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
+ ok(!ret, "expected success\n");
+ ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
WSASetLastError(0xdeadbeef);
ret = sendto(client, "test", 5, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
More information about the wine-cvs
mailing list