Updated Branches: refs/heads/master 8cd3efe50 -> fd7ddef72
THRIFT-1944: Binding to zero port Client: cpp Patch: Akshat Aranya Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/fd7ddef7 Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/fd7ddef7 Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/fd7ddef7 Branch: refs/heads/master Commit: fd7ddef7295d9d3459ff0f46829a479ea3a7f724 Parents: 8cd3efe Author: Ben Craig <[email protected]> Authored: Mon Sep 16 15:41:39 2013 -0500 Committer: Ben Craig <[email protected]> Committed: Mon Sep 16 15:41:39 2013 -0500 ---------------------------------------------------------------------- lib/cpp/src/thrift/transport/TServerSocket.cpp | 27 +++++++++++++++++++++ lib/cpp/src/thrift/transport/TServerSocket.h | 1 + 2 files changed, 28 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/fd7ddef7/lib/cpp/src/thrift/transport/TServerSocket.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index 59a0885..1df719d 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<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"); http://git-wip-us.apache.org/repos/asf/thrift/blob/fd7ddef7/lib/cpp/src/thrift/transport/TServerSocket.h ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.h b/lib/cpp/src/thrift/transport/TServerSocket.h index 4a8c029..e7b7a82 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<TTransport> acceptImpl();
