Winsock: WSAIoctl Fixes
Robert Shearman
rob at codeweavers.com
Thu Sep 30 13:39:18 CDT 2004
Changelog:
- Fix calculation of required buffer size.
- Add support for detecting the IFF_MULTICAST flag.
- Stub for SIO_ADDRESS_LIST_CHANGE.
-------------- next part --------------
Index: wine/dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.158
diff -u -p -r1.158 socket.c
--- wine/dlls/winsock/socket.c 22 Sep 2004 02:46:39 -0000 1.158
+++ wine/dlls/winsock/socket.c 30 Sep 2004 18:03:13 -0000
@@ -1782,6 +1782,10 @@ INT WINAPI WSAIoctl (SOCKET s,
if (fd == -1) return SOCKET_ERROR;
+ TRACE("%d, 0x%08lx, %p, %ld, %p, %ld, %p, %p, %p\n",
+ s, dwIoControlCode, lpvInBuffer, cbInBuffer, lpbOutBuffer,
+ cbOutBuffer, lpcbBytesReturned, lpOverlapped, lpCompletionRoutine);
+
switch( dwIoControlCode )
{
case SIO_GET_INTERFACE_LIST:
@@ -1819,8 +1823,9 @@ INT WINAPI WSAIoctl (SOCKET s,
{
PIP_ADAPTER_INFO ptr;
- if (size > cbOutBuffer)
+ if (size*sizeof(INTERFACE_INFO)/sizeof(IP_ADAPTER_INFO) > cbOutBuffer)
{
+ WARN("Buffer too small = %lu, cbOutBuffer = %lu\n", size, cbOutBuffer);
HeapFree(GetProcessHeap(),0,table);
release_sock_fd( s, fd );
WSASetLastError(WSAEFAULT);
@@ -1859,6 +1864,8 @@ INT WINAPI WSAIoctl (SOCKET s,
intArray->iiFlags |= WS_IFF_LOOPBACK;
if (ifInfo.ifr_flags & IFF_UP)
intArray->iiFlags |= WS_IFF_UP;
+ if (ifInfo.ifr_flags & IFF_MULTICAST)
+ intArray->iiFlags |= WS_IFF_MULTICAST;
}
addr = inet_addr(ptr->IpAddressList.IpAddress.String);
@@ -1907,6 +1914,12 @@ INT WINAPI WSAIoctl (SOCKET s,
*lpcbBytesReturned = sizeof(INTERFACE_INFO) * numInt;
break;
}
+
+ case SIO_ADDRESS_LIST_CHANGE:
+ FIXME("-> SIO_ADDRESS_LIST_CHANGE request: stub\n");
+ /* FIXME: error and return code depend on whether socket was created
+ * with WSA_FLAG_OVERLAPPED, but there is no easy way to get this */
+ break;
default:
WARN("\tunsupported WS_IOCTL cmd (%08lx)\n", dwIoControlCode);
Index: wine/include/winsock2.h
===================================================================
RCS file: /home/wine/wine/include/winsock2.h,v
retrieving revision 1.24
diff -u -p -r1.24 winsock2.h
--- wine/include/winsock2.h 13 Sep 2004 23:18:19 -0000 1.24
+++ wine/include/winsock2.h 30 Sep 2004 18:03:13 -0000
@@ -117,6 +117,7 @@ extern "C" {
#define IOC_WS2 0x08000000
#define IOC_PROTOCOL 0x10000000
#define IOC_VENDOR 0x18000000
+#define IOC_VOID 0x20000000
#define _WSAIO(x,y) (IOC_VOID|(x)|(y))
#define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
More information about the wine-patches
mailing list