Check system commands for result and return error if needed

This commit is contained in:
Simon Fels 2016-06-30 17:42:44 +02:00
commit a06628835b
2 changed files with 24 additions and 3 deletions

View file

@ -37,6 +37,17 @@ PlatformApi::PlatformApi() {
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, void PlatformApi::install_application(anbox::protobuf::bridge::InstallApplication const *request,
anbox::protobuf::bridge::Void *response, anbox::protobuf::bridge::Void *response,
google::protobuf::Closure *done) { 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); 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(); 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); 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(); done->Run();
} }
@ -91,7 +102,7 @@ void PlatformApi::set_dns_servers(anbox::protobuf::bridge::SetDnsServers const *
argv.push_back(request->servers(n).address()); argv.push_back(request->servers(n).address());
auto process = core::posix::exec("/system/bin/ndc", argv, common_env, core::posix::StandardStream::empty); 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(); done->Run();
} }

View file

@ -24,6 +24,12 @@ class Closure;
} // namespace protobuf } // namespace protobuf
} // namespace google } // namespace google
namespace core {
namespace posix {
class ChildProcess;
} // posix
} // core
namespace anbox { namespace anbox {
namespace protobuf { namespace protobuf {
namespace bridge { namespace bridge {
@ -50,6 +56,10 @@ public:
void set_dns_servers(anbox::protobuf::bridge::SetDnsServers const *request, void set_dns_servers(anbox::protobuf::bridge::SetDnsServers const *request,
anbox::protobuf::bridge::Void *response, anbox::protobuf::bridge::Void *response,
google::protobuf::Closure *done); google::protobuf::Closure *done);
private:
void wait_for_process(core::posix::ChildProcess &process,
anbox::protobuf::bridge::Void *response);
}; };
} // namespace android } // namespace android
} // namespace anbox } // namespace anbox