diff options
Diffstat (limited to 'libs/binder/RpcServer.cpp')
-rw-r--r-- | libs/binder/RpcServer.cpp | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index 879e462e8f..4fa99c0e45 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -55,25 +55,25 @@ void RpcServer::iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction() mAgreedExperimental = true; } -bool RpcServer::setupUnixDomainServer(const char* path) { +status_t RpcServer::setupUnixDomainServer(const char* path) { return setupSocketServer(UnixSocketAddress(path)); } -bool RpcServer::setupVsockServer(unsigned int port) { +status_t RpcServer::setupVsockServer(unsigned int port) { // realizing value w/ this type at compile time to avoid ubsan abort constexpr unsigned int kAnyCid = VMADDR_CID_ANY; return setupSocketServer(VsockSocketAddress(kAnyCid, port)); } -bool RpcServer::setupInetServer(const char* address, unsigned int port, - unsigned int* assignedPort) { +status_t RpcServer::setupInetServer(const char* address, unsigned int port, + unsigned int* assignedPort) { if (assignedPort != nullptr) *assignedPort = 0; auto aiStart = InetSocketAddress::getAddrInfo(address, port); - if (aiStart == nullptr) return false; + if (aiStart == nullptr) return UNKNOWN_ERROR; for (auto ai = aiStart.get(); ai != nullptr; ai = ai->ai_next) { InetSocketAddress socketAddress(ai->ai_addr, ai->ai_addrlen, address, port); - if (!setupSocketServer(socketAddress)) { + if (status_t status = setupSocketServer(socketAddress); status != OK) { continue; } @@ -84,7 +84,7 @@ bool RpcServer::setupInetServer(const char* address, unsigned int port, int savedErrno = errno; ALOGE("Could not getsockname at %s: %s", socketAddress.toString().c_str(), strerror(savedErrno)); - return false; + return -savedErrno; } LOG_ALWAYS_FATAL_IF(len != sizeof(addr), "Wrong socket type: len %zu vs len %zu", static_cast<size_t>(len), sizeof(addr)); @@ -97,11 +97,11 @@ bool RpcServer::setupInetServer(const char* address, unsigned int port, *assignedPort = realPort; } - return true; + return OK; } ALOGE("None of the socket address resolved for %s:%u can be set up as inet server.", address, port); - return false; + return UNKNOWN_ERROR; } void RpcServer::setMaxThreads(size_t threads) { @@ -366,7 +366,7 @@ void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clie } if (incoming) { - LOG_ALWAYS_FATAL_IF(!session->addOutgoingConnection(std::move(client), true), + LOG_ALWAYS_FATAL_IF(OK != session->addOutgoingConnection(std::move(client), true), "server state must already be initialized"); return; } @@ -383,21 +383,22 @@ void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clie RpcSession::join(std::move(session), std::move(setupResult)); } -bool RpcServer::setupSocketServer(const RpcSocketAddress& addr) { +status_t RpcServer::setupSocketServer(const RpcSocketAddress& addr) { LOG_RPC_DETAIL("Setting up socket server %s", addr.toString().c_str()); LOG_ALWAYS_FATAL_IF(hasServer(), "Each RpcServer can only have one server."); unique_fd serverFd( TEMP_FAILURE_RETRY(socket(addr.addr()->sa_family, SOCK_STREAM | SOCK_CLOEXEC, 0))); if (serverFd == -1) { - ALOGE("Could not create socket: %s", strerror(errno)); - return false; + int savedErrno = errno; + ALOGE("Could not create socket: %s", strerror(savedErrno)); + return -savedErrno; } if (0 != TEMP_FAILURE_RETRY(bind(serverFd.get(), addr.addr(), addr.addrSize()))) { int savedErrno = errno; ALOGE("Could not bind socket at %s: %s", addr.toString().c_str(), strerror(savedErrno)); - return false; + return -savedErrno; } // Right now, we create all threads at once, making accept4 slow. To avoid hanging the client, @@ -407,16 +408,16 @@ bool RpcServer::setupSocketServer(const RpcSocketAddress& addr) { if (0 != TEMP_FAILURE_RETRY(listen(serverFd.get(), 50 /*backlog*/))) { int savedErrno = errno; ALOGE("Could not listen socket at %s: %s", addr.toString().c_str(), strerror(savedErrno)); - return false; + return -savedErrno; } LOG_RPC_DETAIL("Successfully setup socket server %s", addr.toString().c_str()); - if (!setupExternalServer(std::move(serverFd))) { + if (status_t status = setupExternalServer(std::move(serverFd)); status != OK) { ALOGE("Another thread has set up server while calling setupSocketServer. Race?"); - return false; + return status; } - return true; + return OK; } void RpcServer::onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) { @@ -449,15 +450,15 @@ unique_fd RpcServer::releaseServer() { return std::move(mServer); } -bool RpcServer::setupExternalServer(base::unique_fd serverFd) { +status_t RpcServer::setupExternalServer(base::unique_fd serverFd) { LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!"); std::lock_guard<std::mutex> _l(mLock); if (mServer.ok()) { ALOGE("Each RpcServer can only have one server."); - return false; + return INVALID_OPERATION; } mServer = std::move(serverFd); - return true; + return OK; } } // namespace android |