// Copyright (c) 2011 The Chromium OS 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 "cros-disks/external_mounter.h"

#include <string>

#include <base/files/file_util.h>
#include <base/logging.h>
#include <chromeos/process.h>

using base::FilePath;
using std::string;

namespace {

// Expected locations of an external mount program
const char* kMountProgramPaths[] = {
  "/bin/mount", "/sbin/mount", "/usr/bin/mount", "/usr/sbin/mount"
};

}  // namespace

namespace cros_disks {

const char ExternalMounter::kMounterType[] = "external";

ExternalMounter::ExternalMounter(const string& source_path,
                                 const string& target_path,
                                 const string& filesystem_type,
                                 const MountOptions& mount_options)
    : Mounter(source_path, target_path, filesystem_type, mount_options) {
}

MountErrorType ExternalMounter::MountImpl() {
  string mount_program = GetMountProgramPath();
  if (mount_program.empty()) {
    LOG(WARNING) << "Could not find an external mount program.";
    return MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND;
  }

  chromeos::ProcessImpl mount_process;
  mount_process.AddArg(mount_program);
  mount_process.AddArg("-t");
  mount_process.AddArg(filesystem_type());
  string options_string = mount_options().ToString();
  if (!options_string.empty()) {
    mount_process.AddArg("-o");
    mount_process.AddArg(options_string);
  }
  mount_process.AddArg(source_path());
  mount_process.AddArg(target_path());

  int return_code = mount_process.Run();
  if (return_code != 0) {
    LOG(WARNING) << "External mount program failed with a return code "
                 << return_code;
    return MOUNT_ERROR_MOUNT_PROGRAM_FAILED;
  }
  return MOUNT_ERROR_NONE;
}

string ExternalMounter::GetMountProgramPath() const {
  for (size_t i = 0; i < arraysize(kMountProgramPaths); ++i) {
    string path = kMountProgramPaths[i];
    if (base::PathExists(FilePath(path)))
      return path;
  }
  return string();
}

}  // namespace cros_disks
