// Copyright 2019 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 "debugd/src/wifi_fw_dump_tool.h"

#include <base/files/file_enumerator.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>

namespace debugd {

std::string WifiFWDumpTool::WifiFWDump() {
  // Directory to search for the wifi firmware dumper in.
  // The full path to the dumper file is unknown because it contains a
  // variably-named directory.
  const char kDirectoryToSearch[] = "/sys/kernel/debug/iwlwifi";
  const base::FilePath wifi_dumper_dir(kDirectoryToSearch);

  if (!base::PathExists(wifi_dumper_dir)) {
    return "Failure: Could not find supported WiFi device. This command "
           "currently only supports Intel WiFi devices.";
  }
  // dir_enum enumerates all directories contained in wifi_dumper_dir
  // non-recursively.
  base::FileEnumerator dir_enum(wifi_dumper_dir, false,
                                base::FileEnumerator::DIRECTORIES);

  // Iterate through subdirectories and check for wifi firmware dumper file.
  for (base::FilePath dir_name = dir_enum.Next(); !dir_name.empty();
       dir_name = dir_enum.Next()) {
    // The path to the firmware dumper file is hardcoded as the wifi_fw_dump
    // crosh command currently only supports Intel wifi.
    base::FilePath dumper_file = dir_name.Append("iwlmvm/fw_dbg_collect");

    // Check if dumper file is contained within dir_name directory.
    if (base::PathExists(dumper_file)) {
      // Write '1' to the dumper file to trigger firmware dump. WriteFile should
      // return the number of bytes written.
      if (base::WriteFile(dumper_file, "1", 1) != 1) {
        return "Failure: Unable to trigger WiFi firmware dump. Failed when "
               "attempting to write to " +
               dumper_file.value();
      }
      return "Success: WiFi firmware dump triggered. Output can be found in "
             "one or both of the following directories: /var/spool/crash/ "
             "/var/log/ ";
    }
  }
  // If below line is executed, the dumper file was not found.
  return "Failure: Could not find supported WiFi device. This command "
         "currently only supports Intel WiFi devices.";
}

}  // namespace debugd
