| 550 | } |
| 551 | |
| 552 | shared_ptr<TSocket> TNonblockingServerSocket::acceptImpl() { |
| 553 | if (serverSocket_ == THRIFT_INVALID_SOCKET) { |
| 554 | throw TTransportException(TTransportException::NOT_OPEN, |
| 555 | "TNonblockingServerSocket not listening"); |
| 556 | } |
| 557 | |
| 558 | struct sockaddr_storage clientAddress; |
| 559 | int size = sizeof(clientAddress); |
| 560 | THRIFT_SOCKET clientSocket |
| 561 | = ::accept(serverSocket_, (struct sockaddr*)&clientAddress, (socklen_t*)&size); |
| 562 | |
| 563 | if (clientSocket == THRIFT_INVALID_SOCKET) { |
| 564 | int errno_copy = THRIFT_GET_SOCKET_ERROR; |
| 565 | TOutput::instance().perror("TNonblockingServerSocket::acceptImpl() ::accept() ", errno_copy); |
| 566 | throw TTransportException(TTransportException::UNKNOWN, "accept()", errno_copy); |
| 567 | } |
| 568 | |
| 569 | // Explicitly set this socket to NONBLOCK mode |
| 570 | int flags = THRIFT_FCNTL(clientSocket, THRIFT_F_GETFL, 0); |
| 571 | if (flags == -1) { |
| 572 | int errno_copy = THRIFT_GET_SOCKET_ERROR; |
| 573 | ::THRIFT_CLOSESOCKET(clientSocket); |
| 574 | TOutput::instance().perror("TNonblockingServerSocket::acceptImpl() THRIFT_FCNTL() THRIFT_F_GETFL ", errno_copy); |
| 575 | throw TTransportException(TTransportException::UNKNOWN, |
| 576 | "THRIFT_FCNTL(THRIFT_F_GETFL)", |
| 577 | errno_copy); |
| 578 | } |
| 579 | |
| 580 | if (-1 == THRIFT_FCNTL(clientSocket, THRIFT_F_SETFL, flags | THRIFT_O_NONBLOCK)) { |
| 581 | int errno_copy = THRIFT_GET_SOCKET_ERROR; |
| 582 | ::THRIFT_CLOSESOCKET(clientSocket); |
| 583 | TOutput::instance() |
| 584 | .perror("TNonblockingServerSocket::acceptImpl() THRIFT_FCNTL() THRIFT_F_SETFL ~THRIFT_O_NONBLOCK ", |
| 585 | errno_copy); |
| 586 | throw TTransportException(TTransportException::UNKNOWN, |
| 587 | "THRIFT_FCNTL(THRIFT_F_SETFL)", |
| 588 | errno_copy); |
| 589 | } |
| 590 | |
| 591 | shared_ptr<TSocket> client = createSocket(clientSocket); |
| 592 | client->setPath(path_); |
| 593 | if (sendTimeout_ > 0) { |
| 594 | client->setSendTimeout(sendTimeout_); |
| 595 | } |
| 596 | if (recvTimeout_ > 0) { |
| 597 | client->setRecvTimeout(recvTimeout_); |
| 598 | } |
| 599 | if (keepAlive_) { |
| 600 | client->setKeepAlive(keepAlive_); |
| 601 | } |
| 602 | client->setCachedAddress((sockaddr*)&clientAddress, size); |
| 603 | |
| 604 | if (acceptCallback_) |
| 605 | acceptCallback_(clientSocket); |
| 606 | |
| 607 | return client; |
| 608 | } |
| 609 |
nothing calls this directly
no test coverage detected