diff --git a/contrib/win32/w32-posix-prototype/win32posix/UnitTests/UnitTests.vcxproj b/contrib/win32/w32-posix-prototype/win32posix/UnitTests/UnitTests.vcxproj
index 9effa11..5131338 100644
--- a/contrib/win32/w32-posix-prototype/win32posix/UnitTests/UnitTests.vcxproj
+++ b/contrib/win32/w32-posix-prototype/win32posix/UnitTests/UnitTests.vcxproj
@@ -107,7 +107,7 @@
Console
true
$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\
- Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
+ Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
@@ -121,7 +121,7 @@
Console
true
- Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
+ Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\
@@ -140,7 +140,7 @@
true
true
true
- Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
+ Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\
@@ -159,7 +159,7 @@
true
true
true
- Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
+ Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)
$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\
diff --git a/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c b/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c
index fb0578a..e4a9c92 100644
--- a/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c
+++ b/contrib/win32/w32-posix-prototype/win32posix/win32posix/socketio.c
@@ -52,6 +52,7 @@ struct acceptEx_context {
char lpOutputBuf[1024];
SOCKET accept_socket;
LPFN_ACCEPTEX lpfnAcceptEx;
+ LPFN_GETACCEPTEXSOCKADDRS lpfnGuidGetAcceptExSockaddrs;
DWORD bytes_received;
};
@@ -63,6 +64,7 @@ socketio_acceptEx(struct w32_io* pio) {
debug2("io:%p", pio);
if (pio->internal.context == NULL) {
GUID GuidAcceptEx = WSAID_ACCEPTEX;
+ GUID GuidGetAcceptExSockaddrs = WSAID_GETACCEPTEXSOCKADDRS;
DWORD dwBytes;
context =
@@ -85,6 +87,20 @@ socketio_acceptEx(struct w32_io* pio) {
return -1;
}
+ if (SOCKET_ERROR == WSAIoctl(pio->sock,
+ SIO_GET_EXTENSION_FUNCTION_POINTER,
+ &GuidGetAcceptExSockaddrs, sizeof(GuidGetAcceptExSockaddrs),
+ &context->lpfnGuidGetAcceptExSockaddrs, sizeof(context->lpfnGuidGetAcceptExSockaddrs),
+ &dwBytes, NULL, NULL))
+ {
+ free(context);
+ errno = errno_from_WSALastError();
+ debug("ERROR:%d, io:%p", errno, pio);
+ return -1;
+ }
+
+
+
context->accept_socket = INVALID_SOCKET;
pio->internal.context = context;
}
@@ -114,8 +130,8 @@ socketio_acceptEx(struct w32_io* pio) {
context->accept_socket,
context->lpOutputBuf,
0,
- sizeof(struct sockaddr_in6) + 16,
- sizeof(struct sockaddr_in6) + 16,
+ sizeof(SOCKADDR_STORAGE) + 16,
+ sizeof(SOCKADDR_STORAGE) + 16,
&context->bytes_received,
&pio->read_overlapped))
{
@@ -616,6 +632,8 @@ socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen) {
struct w32_io *accept_io = NULL;
int iResult = 0;
struct acceptEx_context* context;
+ struct sockaddr *local_address,*remote_address;
+ int local_address_len, remote_address_len;
debug2("io:%p", pio);
/* start io if not already started */
@@ -676,7 +694,16 @@ socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen) {
context->accept_socket = INVALID_SOCKET;
debug2("accept io:%p", accept_io);
- /* TODO : fill in addr */
+ if ((addr != NULL) && (addrlen != NULL)) {
+ context->lpfnGuidGetAcceptExSockaddrs(context->lpOutputBuf, 0,
+ sizeof(SOCKADDR_STORAGE) + 16,
+ sizeof(SOCKADDR_STORAGE) + 16, &local_address,
+ &local_address_len, &remote_address, &remote_address_len);
+ if (remote_address_len) {
+ memcpy(addr, remote_address, remote_address_len);
+ addrlen = remote_address_len;
+ }
+ }
return accept_io;
on_error: