Kai Blin : ws2_32: Add support for FROM_PROTOCOL_INFO to WSASocket().

Alexandre Julliard julliard at winehq.org
Mon May 26 13:12:47 CDT 2008


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

Author: Kai Blin <kai.blin at gmail.com>
Date:   Mon May 26 10:02:42 2008 +0200

ws2_32: Add support for FROM_PROTOCOL_INFO to WSASocket().

---

 dlls/ws2_32/socket.c     |   29 +++++++++++------------------
 dlls/ws2_32/tests/sock.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 include/winsock2.h       |    2 ++
 3 files changed, 55 insertions(+), 18 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index d0d2a13..ab57388 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -297,6 +297,7 @@ static const int ws_af_map[][2] =
 #ifdef HAVE_IPX
     MAP_OPTION( AF_IPX ),
 #endif
+    {FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO},
 };
 
 static const int ws_socktype_map[][2] =
@@ -304,6 +305,7 @@ static const int ws_socktype_map[][2] =
     MAP_OPTION( SOCK_DGRAM ),
     MAP_OPTION( SOCK_STREAM ),
     MAP_OPTION( SOCK_RAW ),
+    {FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO},
 };
 
 static const int ws_proto_map[][2] =
@@ -314,6 +316,7 @@ static const int ws_proto_map[][2] =
     MAP_OPTION( IPPROTO_ICMP ),
     MAP_OPTION( IPPROTO_IGMP ),
     MAP_OPTION( IPPROTO_RAW ),
+    {FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO},
 };
 
 static const int ws_aiflag_map[][2] =
@@ -3781,28 +3784,18 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
       return ret;
     }
 
-    /* check and convert the socket family */
+    /* convert the socket family and type */
     af = convert_af_w2u(af);
-    if (af == -1)
-    {
-      FIXME("Unsupported socket family %d!\n", af);
-      SetLastError(WSAEAFNOSUPPORT);
-      return INVALID_SOCKET;
-    }
-
-    /* check the socket type */
     type = convert_socktype_w2u(type);
-    if (type == -1)
-    {
-      SetLastError(WSAESOCKTNOSUPPORT);
-      return INVALID_SOCKET;
-    }
 
-    /* check the protocol type */
-    if ( protocol < 0 )  /* don't support negative values */
+    if (lpProtocolInfo)
     {
-        SetLastError(WSAEPROTONOSUPPORT);
-        return INVALID_SOCKET;
+        if (af == FROM_PROTOCOL_INFO)
+            af = lpProtocolInfo->iAddressFamily;
+        if (type == FROM_PROTOCOL_INFO)
+            type = lpProtocolInfo->iSocketType;
+        if (protocol == FROM_PROTOCOL_INFO)
+            protocol = lpProtocolInfo->iProtocol;
     }
 
     if ( af == AF_UNSPEC)  /* did they not specify the address family? */
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 405b47e..8aaa72f 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1115,6 +1115,47 @@ static void test_getservbyname(void)
     }
 }
 
+static void test_WSASocket(void)
+{
+    SOCKET sock = INVALID_SOCKET;
+    WSAPROTOCOL_INFOA *pi;
+    int providers[] = {6, 0};
+    int ret, err;
+    UINT pi_size;
+
+    ret = WSAEnumProtocolsA(providers, NULL, &pi_size);
+    ok(ret == SOCKET_ERROR, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
+            ret);
+    err = WSAGetLastError();
+    ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
+            err, WSAENOBUFS);
+
+    pi = HeapAlloc(GetProcessHeap(), 0, pi_size);
+    ok(pi != NULL, "Failed to allocate memory\n");
+    if (pi == NULL) {
+        skip("Can't continue without memory.\n");
+        return;
+    }
+
+    ret = WSAEnumProtocolsA(providers, pi, &pi_size);
+    ok(ret != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n",
+            WSAGetLastError());
+
+    if (ret == 0) {
+        skip("No protocols enumerated.\n");
+        HeapFree(GetProcessHeap(), 0, pi);
+        return;
+    }
+
+    sock = WSASocketA(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
+                      FROM_PROTOCOL_INFO, &pi[0], 0, 0);
+    ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
+            WSAGetLastError());
+
+    closesocket(sock);
+    HeapFree(GetProcessHeap(), 0, pi);
+}
+
 static void test_WSAAddressToStringA(void)
 {
     INT ret;
@@ -2054,6 +2095,7 @@ START_TEST( sock )
     test_UDP();
 
     test_getservbyname();
+    test_WSASocket();
 
     test_WSAAddressToStringA();
     test_WSAAddressToStringW();
diff --git a/include/winsock2.h b/include/winsock2.h
index a302331..b73fde3 100644
--- a/include/winsock2.h
+++ b/include/winsock2.h
@@ -75,6 +75,8 @@ extern "C" {
 
 /* protocol types */
 
+#define FROM_PROTOCOL_INFO       (-1)
+
 #ifndef USE_WS_PREFIX
 #define SOCK_STREAM                1
 #define SOCK_DGRAM                 2




More information about the wine-cvs mailing list