Kai Blin : ws2_32: Implement SO_GET_MAX_MSG_SIZE for getsockopt.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 29 07:24:03 CST 2006


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

Author: Kai Blin <kai.blin at gmail.com>
Date:   Tue Nov 28 18:43:49 2006 +0100

ws2_32: Implement SO_GET_MAX_MSG_SIZE for getsockopt.

---

 dlls/ws2_32/socket.c     |   13 +++++++++++++
 dlls/ws2_32/tests/sock.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 56 insertions(+), 1 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index e5aeed5..50443de 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1828,6 +1828,19 @@ INT WINAPI WS_getsockopt(SOCKET s, INT l
         return 0;
     }
 
+    if (level == WS_SOL_SOCKET && optname == WS_SO_MAX_MSG_SIZE)
+    {
+        if(!optlen || *optlen < sizeof(int) || !optval)
+        {
+            SetLastError(WSAEFAULT);
+            return SOCKET_ERROR;
+        }
+        TRACE("getting global SO_MAX_MSG_SIZE = 65507\n");
+        *(int *)optval = 65507;
+        *optlen = sizeof(int);
+        return 0;
+    }
+
 #ifdef HAVE_IPX
     if(level == NSPROTO_IPX)
     {
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 837eec1..c8b9cc8 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1410,6 +1410,47 @@ static void test_select(void)
 
 }
 
+static void test_extendedSocketOptions()
+{
+    WSADATA wsa;
+    SOCKET sock;
+    struct sockaddr_in sa;
+    int sa_len = sizeof(struct sockaddr_in);
+    int optval, optlen = sizeof(int), ret;
+
+    if(WSAStartup(MAKEWORD(2,0), &wsa)){
+        trace("Winsock failed: 0x%08x. Aborting test\n", WSAGetLastError());
+        return;
+    }
+
+    memset(&sa, 0, sa_len);
+
+    sa.sin_family = AF_INET;
+    sa.sin_port = htons(0);
+    sa.sin_addr.s_addr = htonl(INADDR_ANY);
+
+    if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0){
+        trace("Creating the socket failed: 0x%08x\n", WSAGetLastError());
+        WSACleanup();
+        return;
+    }
+
+    if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
+        trace("Failed to bind socket: 0x%08x\n", WSAGetLastError());
+        closesocket(sock);
+        WSACleanup();
+        return;
+    }
+
+    ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, (int *)&optlen);
+
+    ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret);
+    ok(optval == 65507, "SO_MAX_MSG_SIZE reported %d, expected 65507\n", optval);
+
+    closesocket(sock);
+    WSACleanup();
+}
+
 /**************** Main program  ***************/
 
 START_TEST( sock )
@@ -1419,6 +1460,7 @@ START_TEST( sock )
 
     test_set_getsockopt();
     test_so_reuseaddr();
+    test_extendedSocketOptions();
 
     for (i = 0; i < NUM_TESTS; i++)
     {
@@ -1438,6 +1480,6 @@ START_TEST( sock )
     test_WSAStringToAddressW();
 
     test_select();
-    
+
     Exit();
 }




More information about the wine-cvs mailing list