Module: wine Branch: master Commit: 569f1ac018cd29d38d0943e694acb52d05775002 URL: https://source.winehq.org/git/wine.git/?a=commit;h=569f1ac018cd29d38d0943e69...
Author: Zebediah Figura z.figura12@gmail.com Date: Wed Jun 16 23:33:12 2021 -0500
ws2_32: Move the getpeername() implementation to ntdll.
This adds todo_wine to a couple of tests; however, these are overly zealous invalid parameter tests, and fixing them is nontrivial.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/socket.c | 26 +++++++++++++++++++++++++ dlls/ws2_32/socket.c | 49 +++++++++++++++++++++--------------------------- dlls/ws2_32/tests/sock.c | 4 ++-- include/wine/afd.h | 1 + 4 files changed, 50 insertions(+), 30 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 02700d37d6a..04db120dcbd 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1540,6 +1540,32 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc break; }
+ case IOCTL_AFD_WINE_GETPEERNAME: + { + union unix_sockaddr unix_addr; + socklen_t unix_len = sizeof(unix_addr); + int len; + + if ((status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ))) + return status; + + if (getpeername( fd, &unix_addr.addr, &unix_len ) < 0) + { + status = sock_errno_to_status( errno ); + break; + } + + len = sockaddr_from_unix( &unix_addr, out_buffer, out_size ); + if (out_size < len) + { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + io->Information = len; + status = STATUS_SUCCESS; + break; + } + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 1a484da1527..a4d89e728b8 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2077,42 +2077,35 @@ static BOOL WINAPI WS2_DisconnectEx( SOCKET s, OVERLAPPED *overlapped, DWORD fla return !status; }
+ /*********************************************************************** - * getpeername (WS2_32.5) + * getpeername (ws2_32.5) */ -int WINAPI WS_getpeername(SOCKET s, struct WS_sockaddr *name, int *namelen) +int WINAPI WS_getpeername( SOCKET s, struct WS_sockaddr *addr, int *len ) { - int fd; - int res; - - TRACE("socket %04lx, ptr %p, len %08x\n", s, name, namelen ? *namelen : 0); + IO_STATUS_BLOCK io; + NTSTATUS status;
- fd = get_sock_fd( s, 0, NULL ); - res = SOCKET_ERROR; + TRACE( "socket %#lx, addr %p, len %d\n", s, addr, len ? *len : 0 );
- if (fd != -1) + if (!socket_list_find( s )) { - union generic_unix_sockaddr uaddr; - socklen_t uaddrlen = sizeof(uaddr); + WSASetLastError( WSAENOTSOCK ); + return -1; + }
- if (getpeername(fd, &uaddr.addr, &uaddrlen) == 0) - { - if (!name || !namelen) - SetLastError(WSAEFAULT); - else if (ws_sockaddr_u2ws(&uaddr.addr, name, namelen) != 0) - /* The buffer was too small */ - SetLastError(WSAEFAULT); - else - { - res = 0; - TRACE("=> %s\n", debugstr_sockaddr(name)); - } - } - else - SetLastError(wsaErrno()); - release_sock_fd( s, fd ); + if (!len) + { + SetLastError( WSAEFAULT ); + return -1; } - return res; + + status = NtDeviceIoControlFile( (HANDLE)s, NULL, NULL, NULL, &io, + IOCTL_AFD_WINE_GETPEERNAME, NULL, 0, addr, *len ); + if (!status) + *len = io.Information; + SetLastError( NtStatusToWSAError( status ) ); + return status ? -1 : 0; }
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 3e6461ad994..f67bc4efae5 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -7752,7 +7752,7 @@ static void test_getpeername(void)
ret = getpeername(sock, NULL, NULL); ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); - ok(WSAGetLastError() == WSAENOTCONN, + todo_wine ok(WSAGetLastError() == WSAENOTCONN, "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
memset(&sa, 0, sizeof(sa)); @@ -7767,7 +7767,7 @@ static void test_getpeername(void)
ret = getpeername(sock, NULL, NULL); ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); - ok(WSAGetLastError() == WSAENOTCONN, + todo_wine ok(WSAGetLastError() == WSAENOTCONN, "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
ret = connect(sock, (struct sockaddr*)&sa, sizeof(sa)); diff --git a/include/wine/afd.h b/include/wine/afd.h index 19c1e064aaf..ad8e3abf5ba 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -156,6 +156,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_GET_INTERFACE_LIST CTL_CODE(FILE_DEVICE_NETWORK, 213, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AFD_WINE_KEEPALIVE_VALS CTL_CODE(FILE_DEVICE_NETWORK, 214, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AFD_WINE_MESSAGE_SELECT CTL_CODE(FILE_DEVICE_NETWORK, 215, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_AFD_WINE_GETPEERNAME CTL_CODE(FILE_DEVICE_NETWORK, 216, METHOD_BUFFERED, FILE_ANY_ACCESS)
struct afd_create_params {