update_engine_client: Prevent hanging the client.
am: 690810b2a0

* commit '690810b2a0c45b6e4c0c2257c6e7c189cf3bba25':
  update_engine_client: Prevent hanging the client.
diff --git a/update_engine_client.cc b/update_engine_client.cc
index f062813..b94ee61 100644
--- a/update_engine_client.cc
+++ b/update_engine_client.cc
@@ -34,11 +34,11 @@
 #include "update_engine/update_status.h"
 #include "update_status_utils.h"
 
+using chromeos_update_engine::UpdateStatusToString;
 using std::string;
 using std::unique_ptr;
 using std::vector;
 using update_engine::UpdateStatus;
-using chromeos_update_engine::UpdateStatusToString;
 
 namespace {
 
@@ -65,14 +65,16 @@
       return 1;
     }
 
-    ret = ProcessFlags();
-    if (ret != kContinueRunning) QuitWithExitCode(ret);
-
+    // We can't call QuitWithExitCode from OnInit(), so we delay the execution
+    // of the ProcessFlags method after the Daemon initialization is done.
+    base::MessageLoop::current()->PostTask(
+        FROM_HERE,
+        base::Bind(&UpdateEngineClient::ProcessFlagsAndExit,
+                   base::Unretained(this)));
     return EX_OK;
   }
 
  private:
-
   // Show the status of the update engine in stdout.
   bool ShowStatus();
 
@@ -81,9 +83,13 @@
   int GetNeedReboot();
 
   // Main method that parses and triggers all the actions based on the passed
-  // flags.
+  // flags. Returns the exit code of the program of kContinueRunning if it
+  // should not exit.
   int ProcessFlags();
 
+  // Processes the flags and exits the program accordingly.
+  void ProcessFlagsAndExit();
+
   // Copy of argc and argv passed to main().
   int argc_;
   char** argv_;
@@ -116,9 +122,10 @@
  public:
   ~WatchingStatusUpdateHandler() override = default;
 
-  void HandleStatusUpdate(int64_t last_checked_time, double progress,
+  void HandleStatusUpdate(int64_t last_checked_time,
+                          double progress,
                           UpdateStatus current_operation,
-                          const std::string& new_version,
+                          const string& new_version,
                           int64_t new_size) override;
 };
 
@@ -176,13 +183,15 @@
 
 class UpdateWaitHandler : public ExitingStatusUpdateHandler {
  public:
-  UpdateWaitHandler(bool exit_on_error) : exit_on_error_(exit_on_error) {}
+  explicit UpdateWaitHandler(bool exit_on_error)
+      : exit_on_error_(exit_on_error) {}
 
   ~UpdateWaitHandler() override = default;
 
-  void HandleStatusUpdate(int64_t last_checked_time, double progress,
+  void HandleStatusUpdate(int64_t last_checked_time,
+                          double progress,
                           UpdateStatus current_operation,
-                          const std::string& new_version,
+                          const string& new_version,
                           int64_t new_size) override;
 
  private:
@@ -259,7 +268,7 @@
   brillo::FlagHelper::Init(argc_, argv_, "Chromium OS Update Engine Client");
 
   // Ensure there are no positional arguments.
-  const std::vector<string> positional_args =
+  const vector<string> positional_args =
       base::CommandLine::ForCurrentProcess()->GetArgs();
   if (!positional_args.empty()) {
     LOG(ERROR) << "Found a positional argument '" << positional_args.front()
@@ -503,6 +512,12 @@
   return 0;
 }
 
+void UpdateEngineClient::ProcessFlagsAndExit() {
+  int ret = ProcessFlags();
+  if (ret != kContinueRunning)
+    QuitWithExitCode(ret);
+}
+
 }  // namespace
 
 int main(int argc, char** argv) {