THRIFT-1944: Binding to zero port
authorBen Craig <bencraig@apache.org>
Mon, 16 Sep 2013 20:41:39 +0000 (15:41 -0500)
committerBen Craig <bencraig@apache.org>
Mon, 16 Sep 2013 20:41:39 +0000 (15:41 -0500)
Client: cpp
Patch: Akshat Aranya

lib/cpp/src/thrift/transport/TServerSocket.cpp
lib/cpp/src/thrift/transport/TServerSocket.h

index 59a0885..1df719d 100755 (executable)
@@ -337,6 +337,29 @@ void TServerSocket::listen() {
 
     // free addrinfo
     freeaddrinfo(res0);
+
+    // retrieve bind info
+    if (port_ == 0 && retries <= retryLimit_) {
+      struct sockaddr sa;
+      socklen_t len = sizeof(sa);
+      std::memset(&sa, 0, len);
+      if (::getsockname(serverSocket_, &sa, &len) < 0) {
+        int errno_copy = errno;
+        GlobalOutput.perror("TServerSocket::getPort() getsockname() ", errno_copy);
+      }
+      else {
+        if (sa.sa_family == AF_INET6) {
+          const struct sockaddr_in6*
+            sin = reinterpret_cast<const struct sockaddr_in6 *>(&sa);
+          port_ = ntohs(sin->sin6_port);
+        }
+        else {
+          const struct sockaddr_in*
+            sin = reinterpret_cast<const struct sockaddr_in *>(&sa);
+          port_ = ntohs(sin->sin_port);
+        }
+      }
+    }
   }
 
   // throw an error if we failed to bind properly
@@ -365,6 +388,10 @@ void TServerSocket::listen() {
   // The socket is now listening!
 }
 
+int TServerSocket::getPort() {
+    return port_;
+}
+
 shared_ptr<TTransport> TServerSocket::acceptImpl() {
   if (serverSocket_ == THRIFT_INVALID_SOCKET) {
     throw TTransportException(TTransportException::NOT_OPEN, "TServerSocket not listening");
index 4a8c029..e7b7a82 100644 (file)
@@ -59,6 +59,7 @@ class TServerSocket : public TServerTransport {
   void close();
 
   void interrupt();
+  int getPort();
 
  protected:
   boost::shared_ptr<TTransport> acceptImpl();