/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */

#include "cmLDConfigLDConfigTool.h"
#include "cmMakefile.h"
#include "cmRuntimeDependencyArchive.h"
#include "cmSystemTools.h"
#include "cmUVProcessChain.h"

#include "cmsys/RegularExpression.hxx"

#include <istream>
#include <string>
#include <vector>

cmLDConfigLDConfigTool::cmLDConfigLDConfigTool(
  cmRuntimeDependencyArchive* archive)
  : cmLDConfigTool(archive)
{
}

bool cmLDConfigLDConfigTool::GetLDConfigPaths(std::vector<std::string>& paths)
{
  std::string ldConfigPath =
    this->Archive->GetMakefile()->GetSafeDefinition("CMAKE_LDCONFIG_COMMAND");
  if (ldConfigPath.empty()) {
    ldConfigPath = cmSystemTools::FindProgram(
      "ldconfig", { "/sbin", "/usr/sbin", "/usr/local/sbin" });
    if (ldConfigPath.empty()) {
      this->Archive->SetError("Could not find ldconfig");
      return false;
    }
  }

  std::vector<std::string> ldConfigCommand;
  cmSystemTools::ExpandListArgument(ldConfigPath, ldConfigCommand);
  ldConfigCommand.emplace_back("-v");
  ldConfigCommand.emplace_back("-N"); // Don't rebuild the cache.
  ldConfigCommand.emplace_back("-X"); // Don't update links.

  cmUVProcessChainBuilder builder;
  builder.SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT)
    .AddCommand(ldConfigCommand);
  auto process = builder.Start();
  if (!process.Valid()) {
    this->Archive->SetError("Failed to start ldconfig process");
    return false;
  }

  std::string line;
  static const cmsys::RegularExpression regex("^([^\t:]*):");
  while (std::getline(*process.OutputStream(), line)) {
    cmsys::RegularExpressionMatch match;
    if (regex.find(line.c_str(), match)) {
      paths.push_back(match.match(1));
    }
  }

  if (!process.Wait()) {
    this->Archive->SetError("Failed to wait on ldconfig process");
    return false;
  }
  auto status = process.GetStatus();
  if (!status[0] || status[0]->ExitStatus != 0) {
    this->Archive->SetError("Failed to run ldconfig");
    return false;
  }

  return true;
}
