summaryrefslogtreecommitdiffhomepage
path: root/test/util/mount_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/util/mount_util.cc')
-rw-r--r--test/util/mount_util.cc176
1 files changed, 0 insertions, 176 deletions
diff --git a/test/util/mount_util.cc b/test/util/mount_util.cc
deleted file mode 100644
index 48640d6a1..000000000
--- a/test/util/mount_util.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2021 The gVisor Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "test/util/mount_util.h"
-
-#include <sys/syscall.h>
-#include <unistd.h>
-
-#include "absl/strings/numbers.h"
-#include "absl/strings/str_split.h"
-
-namespace gvisor {
-namespace testing {
-
-PosixErrorOr<std::vector<ProcMountsEntry>> ProcSelfMountsEntries() {
- std::string content;
- RETURN_IF_ERRNO(GetContents("/proc/self/mounts", &content));
- return ProcSelfMountsEntriesFrom(content);
-}
-
-PosixErrorOr<std::vector<ProcMountsEntry>> ProcSelfMountsEntriesFrom(
- const std::string& content) {
- std::vector<ProcMountsEntry> entries;
- std::vector<std::string> lines =
- absl::StrSplit(content, absl::ByChar('\n'), absl::AllowEmpty());
- std::cerr << "<contents of /proc/self/mounts>" << std::endl;
- for (const std::string& line : lines) {
- std::cerr << line << std::endl;
- if (line.empty()) {
- continue;
- }
-
- // Parse a single entry from /proc/self/mounts.
- //
- // Example entries:
- //
- // sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
- // proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
- // ^ ^ ^ ^ ^ ^
- // 0 1 2 3 4 5
-
- ProcMountsEntry entry;
- std::vector<std::string> fields =
- absl::StrSplit(line, absl::ByChar(' '), absl::AllowEmpty());
- if (fields.size() != 6) {
- return PosixError(
- EINVAL, absl::StrFormat("Not enough tokens, got %d, content: <<%s>>",
- fields.size(), content));
- }
-
- entry.spec = fields[0];
- entry.mount_point = fields[1];
- entry.fstype = fields[2];
- entry.mount_opts = fields[3];
- ASSIGN_OR_RETURN_ERRNO(entry.dump, Atoi<uint32_t>(fields[4]));
- ASSIGN_OR_RETURN_ERRNO(entry.fsck, Atoi<uint32_t>(fields[5]));
-
- entries.push_back(entry);
- }
- std::cerr << "<end of /proc/self/mounts>" << std::endl;
-
- return entries;
-}
-
-PosixErrorOr<std::vector<ProcMountInfoEntry>> ProcSelfMountInfoEntries() {
- std::string content;
- RETURN_IF_ERRNO(GetContents("/proc/self/mountinfo", &content));
- return ProcSelfMountInfoEntriesFrom(content);
-}
-
-PosixErrorOr<std::vector<ProcMountInfoEntry>> ProcSelfMountInfoEntriesFrom(
- const std::string& content) {
- std::vector<ProcMountInfoEntry> entries;
- std::vector<std::string> lines =
- absl::StrSplit(content, absl::ByChar('\n'), absl::AllowEmpty());
- std::cerr << "<contents of /proc/self/mountinfo>" << std::endl;
- for (const std::string& line : lines) {
- std::cerr << line << std::endl;
- if (line.empty()) {
- continue;
- }
-
- // Parse a single entry from /proc/self/mountinfo.
- //
- // Example entries:
- //
- // 22 28 0:20 / /sys rw,relatime shared:7 - sysfs sysfs rw
- // 23 28 0:21 / /proc rw,relatime shared:14 - proc proc rw
- // ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
- // 0 1 2 3 4 5 6 7 8 9 10
-
- ProcMountInfoEntry entry;
- std::vector<std::string> fields =
- absl::StrSplit(line, absl::ByChar(' '), absl::AllowEmpty());
- if (fields.size() < 10 || fields.size() > 11) {
- return PosixError(
- EINVAL, absl::StrFormat(
- "Unexpected number of tokens, got %d, content: <<%s>>",
- fields.size(), content));
- }
-
- ASSIGN_OR_RETURN_ERRNO(entry.id, Atoi<uint64_t>(fields[0]));
- ASSIGN_OR_RETURN_ERRNO(entry.parent_id, Atoi<uint64_t>(fields[1]));
-
- std::vector<std::string> devs =
- absl::StrSplit(fields[2], absl::ByChar(':'));
- if (devs.size() != 2) {
- return PosixError(
- EINVAL,
- absl::StrFormat(
- "Failed to parse dev number field %s: too many tokens, got %d",
- fields[2], devs.size()));
- }
- ASSIGN_OR_RETURN_ERRNO(entry.major, Atoi<dev_t>(devs[0]));
- ASSIGN_OR_RETURN_ERRNO(entry.minor, Atoi<dev_t>(devs[1]));
-
- entry.root = fields[3];
- entry.mount_point = fields[4];
- entry.mount_opts = fields[5];
-
- // The optional field (fields[6]) may or may not be present. We know based
- // on the total number of tokens.
- int off = -1;
- if (fields.size() == 11) {
- entry.optional = fields[6];
- off = 0;
- }
- // Field 7 is the optional field terminator char '-'.
- entry.fstype = fields[8 + off];
- entry.mount_source = fields[9 + off];
- entry.super_opts = fields[10 + off];
-
- entries.push_back(entry);
- }
- std::cerr << "<end of /proc/self/mountinfo>" << std::endl;
-
- return entries;
-}
-
-absl::flat_hash_map<std::string, std::string> ParseMountOptions(
- std::string mopts) {
- absl::flat_hash_map<std::string, std::string> entries;
- const std::vector<std::string> tokens =
- absl::StrSplit(mopts, absl::ByChar(','), absl::AllowEmpty());
- for (const auto& token : tokens) {
- std::vector<std::string> kv =
- absl::StrSplit(token, absl::MaxSplits('=', 1));
- if (kv.size() == 2) {
- entries[kv[0]] = kv[1];
- } else if (kv.size() == 1) {
- entries[kv[0]] = "";
- } else {
- TEST_CHECK_MSG(
- false,
- absl::StrFormat(
- "Invalid mount option token '%s', was split into %d subtokens",
- token, kv.size())
- .c_str());
- }
- }
- return entries;
-}
-
-} // namespace testing
-} // namespace gvisor