blob: e7cd7bebf00b21388a55663cb6e7c0a67d104b9a [file] [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();
node_res->GetDict().Set(
"is_emmc_attached",
mmc_attached_hosts.count(mmc_host_name) ? "1" : "0");
results.Append(std::move(*node_res));
}
return results;
}
} // namespace runtime_probe