From fd7ddef7295d9d3459ff0f46829a479ea3a7f724 Mon Sep 17 00:00:00 2001 From: Ben Craig Date: Mon, 16 Sep 2013 15:41:39 -0500 Subject: [PATCH] THRIFT-1944: Binding to zero port Client: cpp Patch: Akshat Aranya --- .../src/thrift/transport/TServerSocket.cpp | 27 +++++++++++++++++++ lib/cpp/src/thrift/transport/TServerSocket.h | 1 + 2 files changed, 28 insertions(+) diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index 59a08859..1df719d8 100755 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -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(&sa); + port_ = ntohs(sin->sin6_port); + } + else { + const struct sockaddr_in* + sin = reinterpret_cast(&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 TServerSocket::acceptImpl() { if (serverSocket_ == THRIFT_INVALID_SOCKET) { throw TTransportException(TTransportException::NOT_OPEN, "TServerSocket not listening"); diff --git a/lib/cpp/src/thrift/transport/TServerSocket.h b/lib/cpp/src/thrift/transport/TServerSocket.h index 4a8c0295..e7b7a821 100644 --- a/lib/cpp/src/thrift/transport/TServerSocket.h +++ b/lib/cpp/src/thrift/transport/TServerSocket.h @@ -59,6 +59,7 @@ class TServerSocket : public TServerTransport { void close(); void interrupt(); + int getPort(); protected: boost::shared_ptr acceptImpl(); -- 2.17.1