Alexandre Julliard : ws2_32: Merge ioctlsocket implementation into WSAIoctl .

Alexandre Julliard julliard at winehq.org
Tue Apr 19 12:08:17 CDT 2011


Module: wine
Branch: master
Commit: 7e208f4896806e74e0ea04eb0928d2cac83630f7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7e208f4896806e74e0ea04eb0928d2cac83630f7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr 19 11:57:37 2011 +0200

ws2_32: Merge ioctlsocket implementation into WSAIoctl.

---

 dlls/ws2_32/socket.c |  130 +++++++++++++++++++-------------------------------
 1 files changed, 49 insertions(+), 81 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index ca6f27e..303462d 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3068,30 +3068,62 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
                     DWORD out_size, LPDWORD ret_size, LPWSAOVERLAPPED overlapped,
                     LPWSAOVERLAPPED_COMPLETION_ROUTINE completion )
 {
+    int fd;
+
     TRACE("%ld, 0x%08x, %p, %d, %p, %d, %p, %p, %p\n",
           s, code, in_buff, in_size, out_buff, out_size, ret_size, overlapped, completion);
 
     switch (code)
     {
     case WS_FIONBIO:
-        if (in_size != sizeof(WS_u_long)) {
+        if (in_size != sizeof(WS_u_long) || IS_INTRESOURCE(in_buff))
+        {
             WSASetLastError(WSAEFAULT);
             return SOCKET_ERROR;
         }
-        return WS_ioctlsocket( s, WS_FIONBIO, in_buff);
+        if (_get_sock_mask(s))
+        {
+            /* AsyncSelect()'ed sockets are always nonblocking */
+            if (*(WS_u_long *)in_buff) return 0;
+            SetLastError(WSAEINVAL);
+            return SOCKET_ERROR;
+        }
+        if (*(WS_u_long *)in_buff)
+            _enable_event(SOCKET2HANDLE(s), 0, FD_WINE_NONBLOCKING, 0);
+        else
+            _enable_event(SOCKET2HANDLE(s), 0, 0, FD_WINE_NONBLOCKING);
+        return 0;
 
-   case WS_FIONREAD:
-        if (out_size != sizeof(WS_u_long)) {
+    case WS_FIONREAD:
+    case WS_SIOCATMARK:
+    {
+        int cmd = code == WS_FIONREAD ? FIONREAD : SIOCATMARK;
+        if (out_size != sizeof(WS_u_long) || IS_INTRESOURCE(out_buff))
+        {
             WSASetLastError(WSAEFAULT);
             return SOCKET_ERROR;
         }
-        return WS_ioctlsocket( s, WS_FIONREAD, out_buff);
+        if ((fd = get_sock_fd( s, 0, NULL )) == -1) return SOCKET_ERROR;
+        if (ioctl(fd, cmd, out_buff ) == -1)
+        {
+            SetLastError((errno == EBADF) ? WSAENOTSOCK : wsaErrno());
+            release_sock_fd( s, fd );
+            return SOCKET_ERROR;
+        }
+        release_sock_fd( s, fd );
+        if (ret_size) *ret_size = sizeof(WS_u_long);
+        return 0;
+    }
+
+    case WS_FIOASYNC:
+        WARN("Warning: WS1.1 shouldn't be using async I/O\n");
+        SetLastError(WSAEINVAL);
+        return SOCKET_ERROR;
 
    case WS_SIO_GET_INTERFACE_LIST:
        {
            INTERFACE_INFO* intArray = out_buff;
            DWORD size, numInt, apiReturn;
-           int fd;
 
            TRACE("-> SIO_GET_INTERFACE_LIST request\n");
 
@@ -3355,7 +3387,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
 
    case WS_SIO_KEEPALIVE_VALS:
    {
-        int fd;
         struct tcp_keepalive *k = in_buff;
         int keepalive = k->onoff ? 1 : 0;
         int keepidle = k->keepalivetime / 1000;
@@ -3483,13 +3514,16 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
    case WS_SIO_UDP_CONNRESET:
        FIXME("WS_SIO_UDP_CONNRESET stub\n");
        break;
-   default:
-       FIXME("unsupported WS_IOCTL cmd (%s)\n", debugstr_wsaioctl(code));
-       WSASetLastError(WSAEOPNOTSUPP);
-       return SOCKET_ERROR;
-   }
+    case 0x667e: /* Netscape tries hard to use bogus ioctl 0x667e */
+        WSASetLastError(WSAEOPNOTSUPP);
+        return SOCKET_ERROR;
+    default:
+        FIXME("unsupported WS_IOCTL cmd (%s)\n", debugstr_wsaioctl(code));
+        WSASetLastError(WSAEOPNOTSUPP);
+        return SOCKET_ERROR;
+    }
 
-   return 0;
+    return 0;
 }
 
 
@@ -3498,74 +3532,8 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
  */
 int WINAPI WS_ioctlsocket(SOCKET s, LONG cmd, WS_u_long *argp)
 {
-    int fd;
-    LONG newcmd  = cmd;
-
-    TRACE("socket %04lx, cmd %08x, ptr %p\n", s, cmd, argp);
-    /* broken apps like defcon pass the argp value directly instead of a pointer to it */
-    if(IS_INTRESOURCE(argp))
-    {
-       SetLastError(WSAEFAULT);
-       return SOCKET_ERROR;
-    }
-
-    switch( cmd )
-    {
-    case WS_FIONREAD:
-        newcmd=FIONREAD;
-        break;
-
-    case WS_FIONBIO:
-        if( _get_sock_mask(s) )
-        {
-            /* AsyncSelect()'ed sockets are always nonblocking */
-            if (*argp) return 0;
-            SetLastError(WSAEINVAL);
-            return SOCKET_ERROR;
-        }
-        if (*argp)
-            _enable_event(SOCKET2HANDLE(s), 0, FD_WINE_NONBLOCKING, 0);
-        else
-            _enable_event(SOCKET2HANDLE(s), 0, 0, FD_WINE_NONBLOCKING);
-        return 0;
-
-    case WS_SIOCATMARK:
-        newcmd=SIOCATMARK;
-        break;
-
-    case WS_FIOASYNC:
-        WARN("Warning: WS1.1 shouldn't be using async I/O\n");
-        SetLastError(WSAEINVAL);
-        return SOCKET_ERROR;
-
-    case SIOCGIFBRDADDR:
-    case SIOCGIFNETMASK:
-    case SIOCGIFADDR:
-        /* These don't need any special handling.  They are used by
-           WsControl, and are here to suppress an unnecessary warning. */
-        break;
-
-    default:
-        /* Netscape tries hard to use bogus ioctl 0x667e */
-        /* FIXME: 0x667e above is ('f' << 8) | 126, and is a low word of
-         * FIONBIO (_IOW('f', 126, u_long)), how that should be handled?
-         */
-        WARN("\tunknown WS_IOCTL cmd (%08x)\n", cmd);
-        break;
-    }
-
-    fd = get_sock_fd( s, 0, NULL );
-    if (fd != -1)
-    {
-        if( ioctl(fd, newcmd, (char*)argp ) == 0 )
-        {
-            release_sock_fd( s, fd );
-            return 0;
-        }
-        SetLastError((errno == EBADF) ? WSAENOTSOCK : wsaErrno());
-        release_sock_fd( s, fd );
-    }
-    return SOCKET_ERROR;
+    DWORD ret_size;
+    return WSAIoctl( s, cmd, argp, sizeof(WS_u_long), argp, sizeof(WS_u_long), &ret_size, NULL, NULL );
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list