// Copyright 2018 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 "dlcservice/boot/boot_device.h"

#include <linux/limits.h>

#include <base/strings/string_util.h>
#include <rootdev/rootdev.h>

#include "dlcservice/utils.h"

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

namespace dlcservice {

bool BootDevice::IsRemovableDevice(const string& device) {
  string sysfs_block = SysfsBlockDevice(device);
  string removable;
  if (sysfs_block.empty() ||
      !base::ReadFileToString(JoinPaths(sysfs_block, "removable"),
                              &removable)) {
    return false;
  }
  base::TrimWhitespaceASCII(removable, base::TRIM_ALL, &removable);
  return removable == "1";
}

string BootDevice::GetBootDevice() {
  char boot_path[PATH_MAX] = "";
  // Resolve the boot device path fully, including dereferencing through
  // dm-verity.
  int ret = rootdev(boot_path, sizeof(boot_path), true, /*full resolution*/
                    false /*do not remove partition #*/);
  if (ret < 0) {
    LOG(ERROR) << "rootdev failed to find the root device";
    return "";
  }
  LOG_IF(WARNING, ret > 0) << "rootdev found a device name with no device node";

  // This local variable is used to construct the return string and is not
  // passed around after use.
  return boot_path;
}

string BootDevice::SysfsBlockDevice(const string& device) {
  FilePath device_path(device);
  if (device_path.DirName().value() != "/dev") {
    return "";
  }
  return JoinPaths("/sys/block", device_path.BaseName()).value();
}

}  // namespace dlcservice
