summaryrefslogtreecommitdiffstats
path: root/roots.cpp
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2017-09-28 23:12:53 +0200
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-09-28 23:12:53 +0200
commit3a1587f655a0312f1d892a41fe8811d68b435cf5 (patch)
tree9dda3f657fc0f59ab75d7872905df27c9c6e4c38 /roots.cpp
parentMerge "Add a new option in recovery menu to test the background texts" (diff)
parentroots: volume_for_path() parses and tries prefixes. (diff)
downloadandroid_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.tar
android_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.tar.gz
android_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.tar.bz2
android_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.tar.lz
android_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.tar.xz
android_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.tar.zst
android_bootable_recovery-3a1587f655a0312f1d892a41fe8811d68b435cf5.zip
Diffstat (limited to '')
-rw-r--r--roots.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/roots.cpp b/roots.cpp
index fdcbfe844..835a1dda0 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -68,8 +68,27 @@ void load_volume_table() {
printf("\n");
}
+// Finds the volume specified by the given path. fs_mgr_get_entry_for_mount_point() does exact match
+// only, so it attempts the prefixes recursively (e.g. "/cache/recovery/last_log",
+// "/cache/recovery", "/cache", "/" for a given path of "/cache/recovery/last_log") and returns the
+// first match or nullptr.
Volume* volume_for_path(const char* path) {
- return fs_mgr_get_entry_for_mount_point(fstab, path);
+ if (path == nullptr || path[0] == '\0') return nullptr;
+ std::string str(path);
+ while (true) {
+ Volume* result = fs_mgr_get_entry_for_mount_point(fstab, str.c_str());
+ if (result != nullptr || str == "/") {
+ return result;
+ }
+ size_t slash = str.find_last_of('/');
+ if (slash == std::string::npos) return nullptr;
+ if (slash == 0) {
+ str = "/";
+ } else {
+ str = str.substr(0, slash);
+ }
+ }
+ return nullptr;
}
// Mount the volume specified by path at the given mount_point.