// Copyright 2020 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 <string>

#include <base/files/file_util.h>
#include <base/logging.h>
#include <brillo/syslog_logging.h>

namespace {

// The path to the sysfs allowlist file.
constexpr char kAllowlistPath[] = "/sys/bus/pci/drivers_allowlist";

// Actual driver allowlist.
constexpr const char* kAllowlist[] = {
    // TODO(b/163121310): This list is only for development and may
    // be cleared or pruned before the launch/FSI.
    "pcieport",  // PCI Core services - AER, Hotplug etc.
    "xhci_hcd",  // XHCI host controller driver.
    "nvme",      // PCI Express NVME host controller driver.
    "ahci",      // AHCI driver for SATA hard drives and SSDs
};

}  // namespace.

int main(int argc, char* argv[]) {
  const base::FilePath allowlist_file(kAllowlistPath);

  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderrIfTty);

  if (argc != 1) {
    LOG(ERROR) << "Invalid parameters";
    return 1;
  }

  if (base::PathIsWritable(allowlist_file)) {
    LOG(INFO) << "Kernel supports " << kAllowlistPath
              << ", will install allowlist";
  } else {
    LOG(INFO) << "Kernel doesn't support " << kAllowlistPath
              << ", skip installing allowlist";
    return 0;
  }

  int ret = 0;
  for (const char* drvr_name : kAllowlist) {
    if (base::WriteFile(allowlist_file, drvr_name, sizeof(drvr_name)) ==
        sizeof(drvr_name)) {
      LOG(INFO) << "Allowed " << drvr_name;
    } else {
      PLOG(ERROR) << "Couldn't allow " << drvr_name;
      ret = 1;
    }
  }
  return ret;
}
