blob: 124564922f7d8f053307bcc9887a045bef4f56a2 [file] [log] [blame]
// Copyright 2021 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 "secanomalyd/mounts.h"
#include <optional>
#include <string>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/strings/string_piece.h>
#include <base/strings/string_split.h>
#include <base/strings/string_util.h>
namespace secanomalyd {
namespace {
constexpr char kProcSelfMountsPath[] = "/proc/self/mounts";
}
MaybeMountEntries ReadMounts(MountFilter filter) {
std::string proc_mounts;
if (!base::ReadFileToStringNonBlocking(base::FilePath(kProcSelfMountsPath),
&proc_mounts)) {
PLOG(ERROR) << "Failed to read " << kProcSelfMountsPath;
return std::nullopt;
}
return ReadMountsFromString(proc_mounts, filter);
}
MaybeMountEntries ReadMountsFromString(const std::string& mounts,
MountFilter filter) {
std::vector<base::StringPiece> pieces = base::SplitStringPiece(
mounts, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
if (pieces.empty()) {
return std::nullopt;
}
MountEntries res;
for (const auto& piece : pieces) {
MountEntry e = MountEntry(piece);
if (filter == MountFilter::kUploadableOnly && e.IsUsbDriveOrArchive()) {
// Don't upload USB drive or archive mounts.
continue;
}
res.push_back(e);
}
return MaybeMountEntries(res);
}
} // namespace secanomalyd