diff options
| -rw-r--r-- | libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp | 9 | ||||
| -rw-r--r-- | libs/binder/libbinder_rpc_unstable.cpp | 12 | ||||
| -rw-r--r-- | libs/binder/libbinder_rpc_unstable.map.txt | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp b/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp index 7932d0f29c..0309d6ca53 100644 --- a/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp +++ b/libs/binder/include_rpc_unstable/binder_rpc_unstable.hpp @@ -23,4 +23,13 @@ struct AIBinder; bool RunRpcServer(AIBinder* service, unsigned int port); AIBinder* RpcClient(unsigned int cid, unsigned int port); +// Connect to an RPC server with preconnected file descriptors. +// +// requestFd should connect to the server and return a valid file descriptor, or +// -1 if connection fails. +// +// param will be passed to requestFd. Callers can use param to pass contexts to +// the requestFd function. +AIBinder* RpcPreconnectedClient(int (*requestFd)(void* param), void* param); + } diff --git a/libs/binder/libbinder_rpc_unstable.cpp b/libs/binder/libbinder_rpc_unstable.cpp index bcb13aebdd..304415a7ce 100644 --- a/libs/binder/libbinder_rpc_unstable.cpp +++ b/libs/binder/libbinder_rpc_unstable.cpp @@ -15,6 +15,7 @@ */ #include <android-base/logging.h> +#include <android-base/unique_fd.h> #include <android/binder_libbinder.h> #include <binder/RpcServer.h> #include <binder/RpcSession.h> @@ -24,6 +25,7 @@ using android::RpcServer; using android::RpcSession; using android::status_t; using android::statusToString; +using android::base::unique_fd; extern "C" { @@ -52,4 +54,14 @@ AIBinder* RpcClient(unsigned int cid, unsigned int port) { } return AIBinder_fromPlatformBinder(session->getRootObject()); } + +AIBinder* RpcPreconnectedClient(int (*requestFd)(void* param), void* param) { + auto session = RpcSession::make(); + auto request = [=] { return unique_fd{requestFd(param)}; }; + if (status_t status = session->setupPreconnectedClient(unique_fd{}, request); status != OK) { + LOG(ERROR) << "Failed to set up vsock client. error: " << statusToString(status).c_str(); + return nullptr; + } + return AIBinder_fromPlatformBinder(session->getRootObject()); +} } diff --git a/libs/binder/libbinder_rpc_unstable.map.txt b/libs/binder/libbinder_rpc_unstable.map.txt index 3921a4dde8..1138786a64 100644 --- a/libs/binder/libbinder_rpc_unstable.map.txt +++ b/libs/binder/libbinder_rpc_unstable.map.txt @@ -2,6 +2,7 @@ LIBBINDER_RPC_UNSTABLE_SHIM { # platform-only global: RunRpcServer; RpcClient; + RpcPreconnectedClient; local: *; }; |