Merge "fs_mgr: SkipMountingPartitions() support glob patterns" am: b20e9a3606 am: d56f6e14cd

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1660038

Change-Id: I269cb08492c1f84217eba216d683e8717afce266
This commit is contained in:
Yo Chiang 2021-04-07 06:00:43 +00:00 committed by Automerger Merge Worker
commit 15c3a91fc7

View file

@ -17,6 +17,7 @@
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fnmatch.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -779,21 +780,31 @@ bool SkipMountingPartitions(Fstab* fstab, bool verbose) {
return true;
}
for (const auto& skip_mount_point : Split(skip_config, "\n")) {
if (skip_mount_point.empty()) {
std::vector<std::string> skip_mount_patterns;
for (const auto& line : Split(skip_config, "\n")) {
if (line.empty() || StartsWith(line, "#")) {
continue;
}
auto it = std::remove_if(fstab->begin(), fstab->end(),
[&skip_mount_point](const auto& entry) {
return entry.mount_point == skip_mount_point;
});
if (it == fstab->end()) continue;
fstab->erase(it, fstab->end());
if (verbose) {
LINFO << "Skip mounting partition: " << skip_mount_point;
}
skip_mount_patterns.push_back(line);
}
// Returns false if mount_point matches any of the skip mount patterns, so that the FstabEntry
// would be partitioned to the second group.
auto glob_pattern_mismatch = [&skip_mount_patterns](const FstabEntry& entry) -> bool {
for (const auto& pattern : skip_mount_patterns) {
if (!fnmatch(pattern.c_str(), entry.mount_point.c_str(), 0 /* flags */)) {
return false;
}
}
return true;
};
auto remove_from = std::stable_partition(fstab->begin(), fstab->end(), glob_pattern_mismatch);
if (verbose) {
for (auto it = remove_from; it != fstab->end(); ++it) {
LINFO << "Skip mounting mountpoint: " << it->mount_point;
}
}
fstab->erase(remove_from, fstab->end());
return true;
}
#endif