// 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
