From a06628835be17aa5f9d3a88b58c0e08ee6339004 Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Thu, 30 Jun 2016 17:42:44 +0200 Subject: [PATCH] Check system commands for result and return error if needed --- android/service/platform_api.cpp | 17 ++++++++++++++--- android/service/platform_api.h | 10 ++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/android/service/platform_api.cpp b/android/service/platform_api.cpp index 84b7c8c0..40553406 100644 --- a/android/service/platform_api.cpp +++ b/android/service/platform_api.cpp @@ -37,6 +37,17 @@ PlatformApi::PlatformApi() { PlatformApi::~PlatformApi() { } +void PlatformApi::wait_for_process(core::posix::ChildProcess &process, + anbox::protobuf::bridge::Void *response) { + const auto result = process.wait_for(core::posix::wait::Flags::untraced); + if (result.status != core::posix::wait::Result::Status::exited || + result.detail.if_exited.status != core::posix::exit::Status::success) { + response->set_error("Failed to install application"); + // FIXME once we add proper error codes/domains we need to add structured error + // info the response here. + } +} + void PlatformApi::install_application(anbox::protobuf::bridge::InstallApplication const *request, anbox::protobuf::bridge::Void *response, google::protobuf::Closure *done) { @@ -49,7 +60,7 @@ void PlatformApi::install_application(anbox::protobuf::bridge::InstallApplicatio }; auto process = core::posix::exec("/system/bin/sh", argv, common_env, core::posix::StandardStream::empty); - process.wait_for(core::posix::wait::Flags::untraced); + wait_for_process(process, response); done->Run(); } @@ -70,7 +81,7 @@ void PlatformApi::launch_application(anbox::protobuf::bridge::LaunchApplication }; auto process = core::posix::exec("/system/bin/sh", argv, common_env, core::posix::StandardStream::empty); - process.wait_for(core::posix::wait::Flags::untraced); + wait_for_process(process, response); done->Run(); } @@ -91,7 +102,7 @@ void PlatformApi::set_dns_servers(anbox::protobuf::bridge::SetDnsServers const * argv.push_back(request->servers(n).address()); auto process = core::posix::exec("/system/bin/ndc", argv, common_env, core::posix::StandardStream::empty); - process.wait_for(core::posix::wait::Flags::untraced); + wait_for_process(process, response); done->Run(); } diff --git a/android/service/platform_api.h b/android/service/platform_api.h index 93371451..6e550b8a 100644 --- a/android/service/platform_api.h +++ b/android/service/platform_api.h @@ -24,6 +24,12 @@ class Closure; } // namespace protobuf } // namespace google +namespace core { +namespace posix { +class ChildProcess; +} // posix +} // core + namespace anbox { namespace protobuf { namespace bridge { @@ -50,6 +56,10 @@ public: void set_dns_servers(anbox::protobuf::bridge::SetDnsServers const *request, anbox::protobuf::bridge::Void *response, google::protobuf::Closure *done); + +private: + void wait_for_process(core::posix::ChildProcess &process, + anbox::protobuf::bridge::Void *response); }; } // namespace android } // namespace anbox -- GitLab