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