// Copyright (c) 2009 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 "update_engine/utils.h"

namespace chromeos_update_engine {

using std::string;

namespace {
const string kMountPath(utils::kStatefulPartition + "/au_destination");
const string kPostinstallScript("/postinst");
}

void PostinstallRunnerAction::PerformAction() {
  CHECK(HasInputObject());
  const string install_device = GetInputObject();

  int rc = mount(install_device.c_str(), kMountPath.c_str(), "ext3", 0, NULL);
  if (rc < 0) {
    LOG(ERROR) << "Unable to mount destination device " << install_device
               << " onto " << kMountPath;
    processor_->ActionComplete(this, false);
    return;
  }

  // run postinstall script
  rc = system((kMountPath + kPostinstallScript + " " + install_device).c_str());
  bool success = (rc == 0);
  if (!success) {
    LOG(ERROR) << "Postinst command failed with code: " << rc;
  }

  rc = umount(kMountPath.c_str());
  if (rc < 0) {
    // non-fatal
    LOG(ERROR) << "Unable to umount destination device";
  }
  if (success && HasOutputPipe()) {
    SetOutputObject(install_device);
  }
  processor_->ActionComplete(this, success);
}

}  // namespace chromeos_update_engine
