[PATCH v2 2/4] ws2_32: Use IOCTL_WINE_AFD_COMPLETE_ASYNC in SIO_ADDRESS_LIST_QUERY.
Zebediah Figura
z.figura12 at gmail.com
Fri Jun 4 16:24:17 CDT 2021
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ws2_32/socket.c | 26 +++++++++++++++++---------
dlls/ws2_32/tests/sock.c | 33 +++++++++++++++------------------
2 files changed, 32 insertions(+), 27 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index ad2e3a1d683..ab736947807 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3399,8 +3399,8 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
break;
}
- case WS_SIO_ADDRESS_LIST_QUERY:
- {
+ case WS_SIO_ADDRESS_LIST_QUERY:
+ {
DWORD size;
TRACE("-> SIO_ADDRESS_LIST_QUERY request\n");
@@ -3415,17 +3415,19 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
if (GetAdaptersInfo(NULL, &size) == ERROR_BUFFER_OVERFLOW)
{
IP_ADAPTER_INFO *p, *table = HeapAlloc(GetProcessHeap(), 0, size);
+ NTSTATUS status = STATUS_SUCCESS;
SOCKET_ADDRESS_LIST *sa_list;
SOCKADDR_IN *sockaddr;
SOCKET_ADDRESS *sa;
unsigned int i;
+ DWORD ret = 0;
DWORD num;
if (!table || GetAdaptersInfo(table, &size))
{
HeapFree(GetProcessHeap(), 0, table);
- status = WSAEINVAL;
- break;
+ SetLastError( WSAEINVAL );
+ return -1;
}
for (p = table, num = 0; p; p = p->Next)
@@ -3436,8 +3438,8 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
{
*ret_size = total;
HeapFree(GetProcessHeap(), 0, table);
- status = WSAEFAULT;
- break;
+ SetLastError( WSAEFAULT );
+ return -1;
}
sa_list = out_buff;
@@ -3459,14 +3461,20 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
}
HeapFree(GetProcessHeap(), 0, table);
+
+ ret = server_ioctl_sock( s, IOCTL_AFD_WINE_COMPLETE_ASYNC, &status, sizeof(status),
+ NULL, 0, ret_size, overlapped, completion );
+ *ret_size = total;
+ SetLastError( ret );
+ return ret ? -1 : 0;
}
else
{
WARN("unable to get IP address list\n");
- status = WSAEINVAL;
+ SetLastError( WSAEINVAL );
+ return -1;
}
- break;
- }
+ }
case WS_SIO_FLUSH:
FIXME("SIO_FLUSH: stub.\n");
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 592baa806c3..e99faa4096b 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -9297,7 +9297,7 @@ static void test_address_list_query(void)
size = 0;
ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, buffer, sizeof(buffer), &size, NULL, NULL);
ok(!ret, "Got unexpected ret %d.\n", ret);
- todo_wine ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
+ ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
ok(size == expect_size, "Expected size %u, got %u.\n", expect_size, size);
expect_size = FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[address_list->iAddressCount]);
@@ -9346,8 +9346,8 @@ static void test_address_list_query(void)
ok(ret == -1, "Got unexpected ret %d.\n", ret);
ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
ok(size == expect_size, "Expected size %u, got %u.\n", expect_size, size);
- todo_wine ok(overlapped.Internal == 0xdeadbeef, "Got status %#x.\n", (NTSTATUS)overlapped.Internal);
- todo_wine ok(overlapped.InternalHigh == 0xdeadbeef, "Got size %Iu.\n", overlapped.InternalHigh);
+ ok(overlapped.Internal == 0xdeadbeef, "Got status %#x.\n", (NTSTATUS)overlapped.Internal);
+ ok(overlapped.InternalHigh == 0xdeadbeef, "Got size %Iu.\n", overlapped.InternalHigh);
overlapped.Internal = 0xdeadbeef;
overlapped.InternalHigh = 0xdeadbeef;
@@ -9367,8 +9367,8 @@ static void test_address_list_query(void)
ok(ret == -1, "Got unexpected ret %d.\n", ret);
ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
ok(size == expect_size, "Expected size %u, got %u.\n", expect_size, size);
- todo_wine ok(overlapped.Internal == 0xdeadbeef, "Got status %#x.\n", (NTSTATUS)overlapped.Internal);
- todo_wine ok(overlapped.InternalHigh == 0xdeadbeef, "Got size %Iu.\n", overlapped.InternalHigh);
+ ok(overlapped.Internal == 0xdeadbeef, "Got status %#x.\n", (NTSTATUS)overlapped.Internal);
+ ok(overlapped.InternalHigh == 0xdeadbeef, "Got size %Iu.\n", overlapped.InternalHigh);
ok(address_list->iAddressCount == 0xcccccccc, "Got %u addresses.\n", address_list->iAddressCount);
overlapped.Internal = 0xdeadbeef;
@@ -9376,19 +9376,19 @@ static void test_address_list_query(void)
size = 0xdeadbeef;
ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, buffer, sizeof(buffer), &size, &overlapped, NULL);
ok(!ret, "Got unexpected ret %d.\n", ret);
- todo_wine ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
+ ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
ok(size == expect_size, "Expected size %u, got %u.\n", expect_size, size);
ret = GetQueuedCompletionStatus(port, &size, &key, &overlapped_ptr, 0);
- todo_wine ok(ret, "Got error %u.\n", GetLastError());
- todo_wine ok(!size, "Got size %u.\n", size);
+ ok(ret, "Got error %u.\n", GetLastError());
+ ok(!size, "Got size %u.\n", size);
ok(overlapped_ptr == &overlapped, "Got overlapped %p.\n", overlapped_ptr);
ok(!overlapped.Internal, "Got status %#x.\n", (NTSTATUS)overlapped.Internal);
- todo_wine ok(!overlapped.InternalHigh, "Got size %Iu.\n", overlapped.InternalHigh);
+ ok(!overlapped.InternalHigh, "Got size %Iu.\n", overlapped.InternalHigh);
ret = GetQueuedCompletionStatus(port, &size, &key, &overlapped_ptr, 0);
ok(!ret, "Expected failure.\n");
- todo_wine ok(GetLastError() == WAIT_TIMEOUT, "Got error %u.\n", GetLastError());
+ ok(GetLastError() == WAIT_TIMEOUT, "Got error %u.\n", GetLastError());
closesocket(s);
CloseHandle(port);
@@ -9408,14 +9408,11 @@ static void test_address_list_query(void)
ok(size == expect_size, "got size %u\n", size);
ret = SleepEx(0, TRUE);
- todo_wine ok(ret == WAIT_IO_COMPLETION, "got %d\n", ret);
- if (ret == WAIT_IO_COMPLETION)
- {
- ok(apc_count == 1, "APC was called %u times\n", apc_count);
- ok(!apc_error, "got APC error %u\n", apc_error);
- ok(!apc_size, "got APC size %u\n", apc_size);
- ok(apc_overlapped == &overlapped, "got APC overlapped %p\n", apc_overlapped);
- }
+ ok(ret == WAIT_IO_COMPLETION, "got %d\n", ret);
+ ok(apc_count == 1, "APC was called %u times\n", apc_count);
+ ok(!apc_error, "got APC error %u\n", apc_error);
+ ok(!apc_size, "got APC size %u\n", apc_size);
+ ok(apc_overlapped == &overlapped, "got APC overlapped %p\n", apc_overlapped);
closesocket(s);
}
--
2.30.2
More information about the wine-devel
mailing list