blob: 1963ba41e30ff00045a82ece5a474a4adfabd715 [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "runtime_probe/functions/mmc_host.h"
#include <set>
#include <string>
#include <utility>
#include <base/files/file_util.h>
#include "runtime_probe/system/context.h"
#include "runtime_probe/utils/bus_utils.h"
#include "runtime_probe/utils/file_utils.h"
namespace runtime_probe {
std::set<std::string> GetEmmcAttachedHosts() {
std::set<std::string> result;
base::FilePath pattern =
Context::Get()->root_dir().Append("sys/bus/mmc/devices/*");
for (const auto& mmc_path : Glob(pattern)) {
std::string type;
if (!ReadAndTrimFileToString(mmc_path.Append("type"), type) ||
type != "MMC") {
continue;
}
base::FilePath mmc_host_path =
base::MakeAbsoluteFilePath(mmc_path.Append(".."));
std::string mmc_host_name = mmc_host_path.BaseName().value();
result.insert(mmc_host_name);
}
return result;
}
MmcHostFunction::DataType MmcHostFunction::EvalImpl() const {
DataType results;
std::set<std::string> mmc_attached_hosts = GetEmmcAttachedHosts();
base::FilePath pattern =
Context::Get()->root_dir().Append("sys/class/mmc_host/*");
for (const auto& mmc_host_path : Glob(pattern)) {
auto node_res = GetDeviceBusDataFromSysfsNode(mmc_host_path);
if (!node_res) {
continue;
}
std::string mmc_host_name = mmc_host_path.BaseName().value();
bool is_emmc_attached = mmc_attached_hosts.count(mmc_host_name);
if (!is_emmc_attached_.has_value() ||
is_emmc_attached_ == is_emmc_attached) {
node_res->GetDict().Set("is_emmc_attached", is_emmc_attached ? "1" : "0");
results.Append(std::move(*node_res));
}
}
return results;
}
} // namespace runtime_probe