@@ -117,7 +117,8 @@ TServerSocket::TServerSocket(int port)
117117 listening_(false ),
118118 interruptSockWriter_(THRIFT_INVALID_SOCKET),
119119 interruptSockReader_(THRIFT_INVALID_SOCKET),
120- childInterruptSockWriter_(THRIFT_INVALID_SOCKET) {
120+ childInterruptSockWriter_(THRIFT_INVALID_SOCKET),
121+ boundSocketType_(SocketType::NONE) {
121122}
122123
123124TServerSocket::TServerSocket (int port, int sendTimeout, int recvTimeout)
@@ -136,7 +137,8 @@ TServerSocket::TServerSocket(int port, int sendTimeout, int recvTimeout)
136137 listening_(false ),
137138 interruptSockWriter_(THRIFT_INVALID_SOCKET),
138139 interruptSockReader_(THRIFT_INVALID_SOCKET),
139- childInterruptSockWriter_(THRIFT_INVALID_SOCKET) {
140+ childInterruptSockWriter_(THRIFT_INVALID_SOCKET),
141+ boundSocketType_(SocketType::NONE) {
140142}
141143
142144TServerSocket::TServerSocket (const string& address, int port)
@@ -156,7 +158,8 @@ TServerSocket::TServerSocket(const string& address, int port)
156158 listening_(false ),
157159 interruptSockWriter_(THRIFT_INVALID_SOCKET),
158160 interruptSockReader_(THRIFT_INVALID_SOCKET),
159- childInterruptSockWriter_(THRIFT_INVALID_SOCKET) {
161+ childInterruptSockWriter_(THRIFT_INVALID_SOCKET),
162+ boundSocketType_(SocketType::NONE) {
160163}
161164
162165TServerSocket::TServerSocket (const string& path)
@@ -176,7 +179,28 @@ TServerSocket::TServerSocket(const string& path)
176179 listening_(false ),
177180 interruptSockWriter_(THRIFT_INVALID_SOCKET),
178181 interruptSockReader_(THRIFT_INVALID_SOCKET),
179- childInterruptSockWriter_(THRIFT_INVALID_SOCKET) {
182+ childInterruptSockWriter_(THRIFT_INVALID_SOCKET),
183+ boundSocketType_(SocketType::NONE) {
184+ }
185+ TServerSocket::TServerSocket (THRIFT_SOCKET sock,SocketType socketType)
186+ : interruptableChildren_(true ),
187+ port_(0 ),
188+ path_(),
189+ serverSocket_(sock),
190+ acceptBacklog_(DEFAULT_BACKLOG),
191+ sendTimeout_(0 ),
192+ recvTimeout_(0 ),
193+ accTimeout_(-1 ),
194+ retryLimit_(0 ),
195+ retryDelay_(0 ),
196+ tcpSendBuffer_(0 ),
197+ tcpRecvBuffer_(0 ),
198+ keepAlive_(false ),
199+ listening_(false ),
200+ interruptSockWriter_(THRIFT_INVALID_SOCKET),
201+ interruptSockReader_(THRIFT_INVALID_SOCKET),
202+ childInterruptSockWriter_(THRIFT_INVALID_SOCKET),
203+ boundSocketType_(socketType) {
180204}
181205
182206TServerSocket::~TServerSocket () {
@@ -439,7 +463,8 @@ void TServerSocket::listen() {
439463 if (isUnixDomainSocket ()) {
440464 // -- Unix Domain Socket -- //
441465
442- serverSocket_ = socket (PF_UNIX, SOCK_STREAM, IPPROTO_IP);
466+ if (serverSocket_ == THRIFT_INVALID_SOCKET)
467+ serverSocket_ = socket (PF_UNIX, SOCK_STREAM, IPPROTO_IP);
443468
444469 if (serverSocket_ == THRIFT_INVALID_SOCKET) {
445470 int errno_copy = THRIFT_GET_SOCKET_ERROR;
@@ -471,6 +496,8 @@ void TServerSocket::listen() {
471496 throw TTransportException (TTransportException::NOT_OPEN,
472497 " Unix Domain socket path not supported" );
473498#endif
499+ } else if ( boundSocketType_ != SocketType::NONE){
500+ // -- Socket is already bound
474501 } else {
475502 // -- TCP socket -- //
476503
@@ -516,25 +543,31 @@ void TServerSocket::listen() {
516543 // use short circuit evaluation here to only sleep if we need to
517544 } while ((retries++ < retryLimit_) && (THRIFT_SLEEP_SEC (retryDelay_) == 0 ));
518545
519- // retrieve bind info
520- if (port_ == 0 && retries <= retryLimit_) {
521- struct sockaddr_storage sa;
522- socklen_t len = sizeof (sa);
523- std::memset (&sa, 0 , len);
524- if (::getsockname (serverSocket_, reinterpret_cast <struct sockaddr *>(&sa), &len) < 0 ) {
525- errno_copy = THRIFT_GET_SOCKET_ERROR;
526- GlobalOutput.perror (" TServerSocket::getPort() getsockname() " , errno_copy);
546+ } // TCP socket //
547+
548+ // retrieve bind info
549+ if ((port_ == 0 || path_.empty () ) && retries <= retryLimit_) {
550+ struct sockaddr_storage sa;
551+ socklen_t len = sizeof (sa);
552+ std::memset (&sa, 0 , len);
553+ if (::getsockname (serverSocket_, reinterpret_cast <struct sockaddr *>(&sa), &len) < 0 ) {
554+ errno_copy = THRIFT_GET_SOCKET_ERROR;
555+ GlobalOutput.perror (" TServerSocket::getPort() getsockname() " , errno_copy);
556+ } else {
557+ if (sa.ss_family == AF_INET6) {
558+ const auto * sin = reinterpret_cast <const struct sockaddr_in6 *>(&sa);
559+ port_ = ntohs (sin->sin6_port );
560+ } else if (sa.ss_family == AF_INET) {
561+ const auto * sin = reinterpret_cast <const struct sockaddr_in *>(&sa);
562+ port_ = ntohs (sin->sin_port );
563+ } else if (sa.ss_family == AF_UNIX) {
564+ const auto * sin = reinterpret_cast <const struct sockaddr_un *>(&sa);
565+ path_ = sin->sun_path ;
527566 } else {
528- if (sa.ss_family == AF_INET6) {
529- const auto * sin = reinterpret_cast <const struct sockaddr_in6 *>(&sa);
530- port_ = ntohs (sin->sin6_port );
531- } else {
532- const auto * sin = reinterpret_cast <const struct sockaddr_in *>(&sa);
533- port_ = ntohs (sin->sin_port );
534- }
567+ GlobalOutput.perror (" TServerSocket::getPort() getsockname() unhandled socket type" ,EINVAL);
535568 }
536569 }
537- } // TCP socket //
570+ }
538571
539572 // throw error if socket still wasn't created successfully
540573 if (serverSocket_ == THRIFT_INVALID_SOCKET) {
@@ -569,7 +602,7 @@ void TServerSocket::listen() {
569602 listenCallback_ (serverSocket_);
570603
571604 // Call listen
572- if (-1 == ::listen (serverSocket_, acceptBacklog_)) {
605+ if (boundSocketType_ == SocketType::NONE && -1 == ::listen (serverSocket_, acceptBacklog_)) {
573606 errno_copy = THRIFT_GET_SOCKET_ERROR;
574607 GlobalOutput.perror (" TServerSocket::listen() listen() " , errno_copy);
575608 close ();
@@ -734,7 +767,8 @@ void TServerSocket::close() {
734767 concurrency::Guard g (rwMutex_);
735768 if (serverSocket_ != THRIFT_INVALID_SOCKET) {
736769 shutdown (serverSocket_, THRIFT_SHUT_RDWR);
737- ::THRIFT_CLOSESOCKET (serverSocket_);
770+ if ( boundSocketType_ == SocketType::NONE) // Do not close the server socket if it owned by systemd
771+ ::THRIFT_CLOSESOCKET (serverSocket_);
738772 }
739773 if (interruptSockWriter_ != THRIFT_INVALID_SOCKET) {
740774 ::THRIFT_CLOSESOCKET (interruptSockWriter_);
0 commit comments