Replace mkdirs() with setupAppDir().
vold historically offerred functionality to create directories on behalf
of others. This functionality was purely used to create app-specific
data/obb/media dirs. Make this more explicit by renaming the method to
indicate this.
Additionally, in the past, we never needed to care about the UID set on
these directories, because sdcardfs would take care of that for us
automatically. But with sdcardfs going away, we need to make sure the
UID of the app-specific directories is set correctly. Allow the caller
to pass this in as an argument.
Bug: 146419093
Test: atest FuseDaemonHostTest
Change-Id: Ibeb5fdc91b40d53583bc0960ee11c4d640549c34
diff --git a/Utils.cpp b/Utils.cpp
index d483418..67c48ad 100644
--- a/Utils.cpp
+++ b/Utils.cpp
@@ -55,6 +55,7 @@
using namespace std::chrono_literals;
using android::base::ReadFileToString;
+using android::base::StartsWith;
using android::base::StringPrintf;
namespace android {
@@ -114,6 +115,27 @@
}
}
+int PrepareDirsFromRoot(std::string path, std::string root, mode_t mode, uid_t uid, gid_t gid) {
+ int ret = 0;
+ if (!StartsWith(path, root)) {
+ return -1;
+ }
+ std::string to_create_from_root = path.substr(root.length());
+
+ size_t pos = 0;
+ while ((pos = to_create_from_root.find('/')) != std::string::npos) {
+ auto component = to_create_from_root.substr(0, pos);
+ to_create_from_root.erase(0, pos + 1);
+ root = root + component + "/";
+ ret = fs_prepare_dir(root.c_str(), mode, uid, gid);
+ if (ret) {
+ break;
+ }
+ }
+
+ return ret;
+}
+
status_t PrepareDir(const std::string& path, mode_t mode, uid_t uid, gid_t gid) {
std::lock_guard<std::mutex> lock(kSecurityLock);
const char* cpath = path.c_str();