Rob Shearman : rpcrt4: Allow listening on dynamically generated ncacn_ip_tcp endpoints.

Alexandre Julliard julliard at winehq.org
Thu Mar 26 11:05:48 CDT 2009


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Thu Mar 26 13:35:43 2009 +0000

rpcrt4: Allow listening on dynamically generated ncacn_ip_tcp endpoints.

---

 dlls/rpcrt4/rpc_transport.c     |   31 ++++++++++++++++++++++++++++---
 dlls/rpcrt4/tests/rpc_protseq.c |    2 --
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c
index e308564..b01228b 100644
--- a/dlls/rpcrt4/rpc_transport.c
+++ b/dlls/rpcrt4/rpc_transport.c
@@ -884,7 +884,7 @@ static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(RpcServerProtseq *pr
     hints.ai_canonname      = NULL;
     hints.ai_next           = NULL;
 
-    ret = getaddrinfo(NULL, endpoint, &hints, &ai);
+    ret = getaddrinfo(NULL, endpoint ? endpoint : "0", &hints, &ai);
     if (ret)
     {
         ERR("getaddrinfo for port %s failed: %s\n", endpoint,
@@ -898,11 +898,13 @@ static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(RpcServerProtseq *pr
     {
         RpcConnection_tcp *tcpc;
         RPC_STATUS create_status;
+        struct sockaddr_storage sa;
+        socklen_t sa_len;
+        char service[NI_MAXSERV];
 
         if (TRACE_ON(rpc))
         {
             char host[256];
-            char service[256];
             getnameinfo(ai_cur->ai_addr, ai_cur->ai_addrlen,
                         host, sizeof(host), service, sizeof(service),
                         NI_NUMERICHOST | NI_NUMERICSERV);
@@ -928,9 +930,28 @@ static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(RpcServerProtseq *pr
               status = RPC_S_CANT_CREATE_ENDPOINT;
             continue;
         }
+
+        sa_len = sizeof(sa);
+        if (getsockname(sock, (struct sockaddr *)&sa, &sa_len))
+        {
+            WARN("getsockname() failed: %s\n", strerror(errno));
+            status = RPC_S_CANT_CREATE_ENDPOINT;
+            continue;
+        }
+
+        ret = getnameinfo((struct sockaddr *)&sa, sa_len,
+                          NULL, 0, service, sizeof(service),
+                          NI_NUMERICSERV);
+        if (ret)
+        {
+            WARN("getnameinfo failed: %s\n", gai_strerror(ret));
+            status = RPC_S_CANT_CREATE_ENDPOINT;
+            continue;
+        }
+
         create_status = RPCRT4_CreateConnection((RpcConnection **)&tcpc, TRUE,
                                                 protseq->Protseq, NULL,
-                                                endpoint, NULL, NULL, NULL);
+                                                service, NULL, NULL, NULL);
         if (create_status != RPC_S_OK)
         {
             closesocket(sock);
@@ -962,6 +983,10 @@ static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(RpcServerProtseq *pr
 
         tcpc->common.Next = first_connection;
         first_connection = &tcpc->common;
+
+        /* since IPv4 and IPv6 share the same port space, we only need one
+         * successful bind to listen for both */
+        break;
     }
 
     freeaddrinfo(ai);
diff --git a/dlls/rpcrt4/tests/rpc_protseq.c b/dlls/rpcrt4/tests/rpc_protseq.c
index a9b98a0..06a82ec 100644
--- a/dlls/rpcrt4/tests/rpc_protseq.c
+++ b/dlls/rpcrt4/tests/rpc_protseq.c
@@ -69,7 +69,6 @@ static void test_RpcServerUseProtseq(void)
     if (status == RPC_S_OK) endpoints_registered++;
 
     status = RpcServerUseProtseq(iptcp, 0, NULL);
-    todo_wine
     ok(status == RPC_S_OK, "RpcServerUseProtseq(ncacn_ip_tcp) failed with status %d\n", status);
     if (status == RPC_S_OK) endpoints_registered++;
 
@@ -101,7 +100,6 @@ static void test_RpcServerUseProtseq(void)
         ok(status == RPC_S_OK, "RpcServerUseProtseq(ncacn_np) failed with status %d\n", status);
 
     status = RpcServerUseProtseq(iptcp, 0, NULL);
-    todo_wine
     ok(status == RPC_S_OK, "RpcServerUseProtseq(ncacn_ip_tcp) failed with status %d\n", status);
 
     status = RpcServerUseProtseq(ncalrpc, 0, NULL);




More information about the wine-cvs mailing list