Mike Kaplinskiy : ws2_32: Create a wrapper for connect.

Alexandre Julliard julliard at winehq.org
Tue Aug 3 13:10:35 CDT 2010


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

Author: Mike Kaplinskiy <mike.kaplinskiy at gmail.com>
Date:   Sat Jul 31 23:21:31 2010 -0400

ws2_32: Create a wrapper for connect.

---

 dlls/ws2_32/socket.c |   59 +++++++++++++++++++++++++++----------------------
 1 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 4b742e1..2db34a5 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1803,6 +1803,33 @@ int WINAPI WS_closesocket(SOCKET s)
     return SOCKET_ERROR;
 }
 
+static int do_connect(int fd, const struct WS_sockaddr* name, int namelen)
+{
+    union generic_unix_sockaddr uaddr;
+    unsigned int uaddrlen = ws_sockaddr_ws2u(name, namelen, &uaddr);
+
+    if (!uaddrlen)
+        return WSAEFAULT;
+
+    if (name->sa_family == WS_AF_INET)
+    {
+        struct sockaddr_in *in4 = (struct sockaddr_in*) &uaddr;
+        if (memcmp(&in4->sin_addr, magic_loopback_addr, 4) == 0)
+        {
+            /* Trying to connect to magic replace-loopback address,
+                * assuming we really want to connect to localhost */
+            TRACE("Trying to connect to magic IP address, using "
+                    "INADDR_LOOPBACK instead.\n");
+            in4->sin_addr.s_addr = htonl(WS_INADDR_LOOPBACK);
+        }
+    }
+
+    if (connect(fd, &uaddr.addr, uaddrlen) == 0)
+        return 0;
+
+    return wsaErrno();
+}
+
 /***********************************************************************
  *		connect		(WS2_32.4)
  */
@@ -1814,33 +1841,11 @@ int WINAPI WS_connect(SOCKET s, const struct WS_sockaddr* name, int namelen)
 
     if (fd != -1)
     {
-        union generic_unix_sockaddr uaddr;
-        unsigned int uaddrlen = ws_sockaddr_ws2u(name, namelen, &uaddr);
+        int ret = do_connect(fd, name, namelen);
+        if (ret == 0)
+            goto connect_success;
 
-        if (!uaddrlen)
-        {
-            SetLastError(WSAEFAULT);
-        }
-        else
-        {
-            if (name->sa_family == WS_AF_INET)
-            {
-                struct sockaddr_in *in4 = (struct sockaddr_in*) &uaddr;
-                if (memcmp(&in4->sin_addr, magic_loopback_addr, 4) == 0)
-                {
-                    /* Trying to connect to magic replace-loopback address,
-                     * assuming we really want to connect to localhost */
-                    TRACE("Trying to connect to magic IP address, using "
-                         "INADDR_LOOPBACK instead.\n");
-                    in4->sin_addr.s_addr = htonl(WS_INADDR_LOOPBACK);
-                }
-            }
-
-            if (connect(fd, &uaddr.addr, uaddrlen) == 0)
-                goto connect_success;
-        }
-
-        if (errno == EINPROGRESS)
+        if (ret == WSAEINPROGRESS)
         {
             /* tell wineserver that a connection is in progress */
             _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE,
@@ -1868,7 +1873,7 @@ int WINAPI WS_connect(SOCKET s, const struct WS_sockaddr* name, int namelen)
         }
         else
         {
-            SetLastError(wsaErrno());
+            SetLastError(ret);
         }
         release_sock_fd( s, fd );
     }




More information about the wine-cvs mailing list