diff options
| author | Alex Deymo <deymo@google.com> | 2016-02-02 18:35:50 -0800 |
|---|---|---|
| committer | Alex Deymo <deymo@google.com> | 2016-02-02 19:43:26 -0800 |
| commit | 2130ee03a1b05c923e3ad44b4beef9849ff939e5 (patch) | |
| tree | ab7a426facbc668f3647f4d529899dd32920f1b5 | |
| parent | ab0d976fa47844870d55c87ab530072cea0c8c53 (diff) | |
Android: Exit from update_engine_client when daemon dies.
When the update_engine daemon dies or is not running,
update_engine_client now exists with an error code and prints a message
stating a daemon-side failure.
Bug: 25631767
TEST=`update_engine_client --follow` and killed update_engine
Change-Id: I7c13df56bd384d2bdbc5df402f730b2797753a10
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | update_engine_client_android.cc | 28 |
2 files changed, 25 insertions, 4 deletions
@@ -460,6 +460,7 @@ LOCAL_C_INCLUDES += \ external/cros/system_api/dbus LOCAL_SHARED_LIBRARIES += \ libbinder \ + libbinderwrapper \ libbrillo-binder \ libutils LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/binder_bindings diff --git a/update_engine_client_android.cc b/update_engine_client_android.cc index 0193eedd..5cbcd339 100644 --- a/update_engine_client_android.cc +++ b/update_engine_client_android.cc @@ -26,6 +26,7 @@ #include <base/logging.h> #include <base/strings/string_split.h> #include <binder/IServiceManager.h> +#include <binderwrapper/binder_wrapper.h> #include <brillo/binder_watcher.h> #include <brillo/daemons/daemon.h> #include <brillo/flag_helper.h> @@ -37,8 +38,8 @@ #include "android/os/BnUpdateEngineCallback.h" #include "android/os/IUpdateEngine.h" #include "update_engine/client_library/include/update_engine/update_status.h" -#include "update_engine/update_status_utils.h" #include "update_engine/common/error_code.h" +#include "update_engine/update_status_utils.h" using android::binder::Status; @@ -69,6 +70,9 @@ class UpdateEngineClientAndroid : public brillo::Daemon { int OnInit() override; + // Called whenever the UpdateEngine daemon dies. + void UpdateEngineServiceDied(); + // Copy of argc and argv passed to main(). int argc_; char** argv_; @@ -137,13 +141,18 @@ int UpdateEngineClientAndroid::OnInit() { } bool keep_running = false; - brillo::InitLog(brillo::kLogToStderr); + + // Initialize a binder watcher early in the process before any interaction + // with the binder driver. + binder_watcher_.Init(); + android::status_t status = android::getService( android::String16("android.os.UpdateEngineService"), &service_); if (status != android::OK) { LOG(ERROR) << "Failed to get IUpdateEngine binder from service manager: " << Status::fromStatusT(status).toString8(); + return ExitWhenIdle(1); } if (FLAGS_suspend) { @@ -186,8 +195,14 @@ int UpdateEngineClientAndroid::OnInit() { if (!keep_running) return ExitWhenIdle(EX_OK); - // Initialize a binder watcher. - binder_watcher_.Init(); + // When following updates status changes, exit if the update_engine daemon + // dies. + android::BinderWrapper::Create(); + android::BinderWrapper::Get()->RegisterForDeathNotifications( + android::os::IUpdateEngine::asBinder(service_), + base::Bind(&UpdateEngineClientAndroid::UpdateEngineServiceDied, + base::Unretained(this))); + return EX_OK; } @@ -206,6 +221,11 @@ int UpdateEngineClientAndroid::ExitWhenIdle(int return_code) { return EX_OK; } +void UpdateEngineClientAndroid::UpdateEngineServiceDied() { + LOG(ERROR) << "UpdateEngineService died."; + QuitWithExitCode(1); +} + } // namespace internal } // namespace chromeos_update_engine |
