diff options
author | 2023-10-09 16:13:52 +0000 | |
---|---|---|
committer | 2023-10-09 16:13:52 +0000 | |
commit | 97c05f176eaa4f68e78f29eeb39c156274c244d8 (patch) | |
tree | 8b7c00eaa9d2b73ab3e38ec421e92db24cc327e5 | |
parent | c99b3a0cef262b6bc795e3779c28f587c4f58334 (diff) | |
parent | b48b9fc4693bb5286a84eeefa61641a90a4b57da (diff) |
Merge "Allow servicedispatcher to use an ip address" into main
-rw-r--r-- | libs/binder/servicedispatcher.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/libs/binder/servicedispatcher.cpp b/libs/binder/servicedispatcher.cpp index 692cc95e3b..8e95d69ffc 100644 --- a/libs/binder/servicedispatcher.cpp +++ b/libs/binder/servicedispatcher.cpp @@ -59,12 +59,13 @@ int Usage(const char* program) { auto basename = Basename(program); auto format = R"(dispatch calls to RPC service. Usage: - %s [-g] <service_name> + %s [-g] [-i <ip_address>] <service_name> <service_name>: the service to connect to. %s [-g] manager Runs an RPC-friendly service that redirects calls to servicemanager. -g: use getService() instead of checkService(). + -i: use ip_address when setting up the server instead of '127.0.0.1' If successful, writes port number and a new line character to stdout, and blocks until killed. @@ -74,7 +75,8 @@ Usage: return EX_USAGE; } -int Dispatch(const char* name, const ServiceRetriever& serviceRetriever) { +int Dispatch(const char* name, const ServiceRetriever& serviceRetriever, + const char* ip_address = kLocalInetAddress) { auto sm = defaultServiceManager(); if (nullptr == sm) { LOG(ERROR) << "No servicemanager"; @@ -91,7 +93,7 @@ int Dispatch(const char* name, const ServiceRetriever& serviceRetriever) { return EX_SOFTWARE; } unsigned int port; - if (status_t status = rpcServer->setupInetServer(kLocalInetAddress, 0, &port); status != OK) { + if (status_t status = rpcServer->setupInetServer(ip_address, 0, &port); status != OK) { LOG(ERROR) << "setupInetServer failed: " << statusToString(status); return EX_SOFTWARE; } @@ -188,7 +190,8 @@ private: // Workaround for b/191059588. // TODO(b/191059588): Once we can run RpcServer on single-threaded services, // `servicedispatcher manager` should call Dispatch("manager") directly. -int wrapServiceManager(const ServiceRetriever& serviceRetriever) { +int wrapServiceManager(const ServiceRetriever& serviceRetriever, + const char* ip_address = kLocalInetAddress) { auto sm = defaultServiceManager(); if (nullptr == sm) { LOG(ERROR) << "No servicemanager"; @@ -212,7 +215,7 @@ int wrapServiceManager(const ServiceRetriever& serviceRetriever) { auto rpcServer = RpcServer::make(); rpcServer->setRootObject(service); unsigned int port; - if (status_t status = rpcServer->setupInetServer(kLocalInetAddress, 0, &port); status != OK) { + if (status_t status = rpcServer->setupInetServer(ip_address, 0, &port); status != OK) { LOG(ERROR) << "Unable to set up inet server: " << statusToString(status); return EX_SOFTWARE; } @@ -272,11 +275,15 @@ int main(int argc, char* argv[]) { int opt; ServiceRetriever serviceRetriever = &android::IServiceManager::checkService; - while (-1 != (opt = getopt(argc, argv, "g"))) { + char* ip_address = nullptr; + while (-1 != (opt = getopt(argc, argv, "gi:"))) { switch (opt) { case 'g': { serviceRetriever = &android::IServiceManager::getService; } break; + case 'i': { + ip_address = optarg; + } break; default: { return Usage(argv[0]); } @@ -291,7 +298,15 @@ int main(int argc, char* argv[]) { auto name = argv[optind]; if (name == "manager"sv) { - return wrapServiceManager(serviceRetriever); + if (ip_address) { + return wrapServiceManager(serviceRetriever, ip_address); + } else { + return wrapServiceManager(serviceRetriever); + } + } + if (ip_address) { + return Dispatch(name, serviceRetriever, ip_address); + } else { + return Dispatch(name, serviceRetriever); } - return Dispatch(name, serviceRetriever); } |