// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "update_engine/postinstall_runner_action.h"
#include <sys/mount.h>
#include <stdlib.h>
#include <vector>
#include "update_engine/subprocess.h"
#include "update_engine/utils.h"

namespace chromeos_update_engine {

using std::string;
using std::vector;

namespace {
const string kPostinstallScript("/postinst");
}

void PostinstallRunnerAction::PerformAction() {
  CHECK(HasInputObject());
  const InstallPlan install_plan = GetInputObject();
  const string install_device = install_plan.install_path;
  ScopedActionCompleter completer(processor_, this);

  // Make mountpoint
  string temp_dir;
  TEST_AND_RETURN(utils::MakeTempDirectory("/tmp/au_postint_mount.XXXXXX",
                                           &temp_dir));
  ScopedDirRemover temp_dir_remover(temp_dir);

  {
    // Scope for the mount
    unsigned long mountflags = MS_RDONLY;

    int rc = mount(install_device.c_str(),
                   temp_dir.c_str(),
                   "ext4",
                   mountflags,
                   NULL);
    if (rc < 0) {
      LOG(INFO) << "Failed to mount install part as ext4. Trying ext3.";
      rc = mount(install_device.c_str(),
                 temp_dir.c_str(),
                 "ext3",
                 mountflags,
                 NULL);
    }
    if (rc < 0) {
      LOG(ERROR) << "Unable to mount destination device " << install_device
                 << " onto " << temp_dir;
      return;
    }
    ScopedFilesystemUnmounter unmounter(temp_dir);

    // run postinstall script
    vector<string> command;
    command.push_back(temp_dir + kPostinstallScript);
    command.push_back(install_device);
    command.push_back(precommit_ ? "" : "--postcommit");
    rc = 0;
    TEST_AND_RETURN(Subprocess::SynchronousExec(command, &rc));
    bool success = (rc == 0);
    if (!success) {
      LOG(ERROR) << "Postinst command failed with code: " << rc;
      return;
    }
  }

  if (HasOutputPipe()) {
    SetOutputObject(install_plan);
  }
  completer.set_code(kActionCodeSuccess);
}

}  // namespace chromeos_update_engine
