// 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/mounter.h"

#include <base/logging.h>

using std::string;

namespace cros_disks {

Mounter::Mounter(const string& source_path,
                 const string& target_path,
                 const string& filesystem_type,
                 const MountOptions& mount_options)
    : filesystem_type_(filesystem_type),
      source_path_(source_path),
      target_path_(target_path),
      mount_options_(mount_options) {
  CHECK(!source_path_.empty()) << "Invalid source path";
  CHECK(!target_path_.empty()) << "Invalid target path";
  // filesystem_type can be empty if it is auto-detected or in case of
  // a bind mount.
}

MountErrorType Mounter::Mount() {
  MountErrorType error = MountImpl();
  if (error != MOUNT_ERROR_NONE) {
    // Try to mount the filesystem read-only if mounting it read-write failed.
    if (!mount_options_.IsReadOnlyOptionSet()) {
      LOG(INFO) << "Trying to mount '" << source_path_ << "' read-only";
      mount_options_.SetReadOnlyOption();
      error = MountImpl();
    }
  }

  if (error == MOUNT_ERROR_NONE) {
    LOG(INFO) << "Mounted '" << source_path_
      << "' to '" << target_path_
      << "' as filesystem '" << filesystem_type_
      << "' with options '" << mount_options_.ToString()
      << "'";
  } else {
    LOG(ERROR) << "Failed to mount '" << source_path_
      << "' to '" << target_path_
      << "' as filesystem '" << filesystem_type_
      << "' with options '" << mount_options_.ToString()
      << "'";
  }
  return error;
}

}  // namespace cros_disks
