diff --git a/src/appspawn_server.cpp b/src/appspawn_server.cpp index df76ef36ff3d2135a70918934f127807ab98021d..3ceae25c81c584b69d034f6135e67733b7b055a6 100644 --- a/src/appspawn_server.cpp +++ b/src/appspawn_server.cpp @@ -733,6 +733,24 @@ int32_t AppSpawnServer::DoSandboxRootFolderCreateAdapt(std::string sandboxPackag return 0; } +void AppSpawnServer::Mkdirs(const std::string &path, mode_t mode) +{ + size_t size = path.size(); + if (size == 0) + return; + + size_t index = 0; + do { + size_t pathIndex = path.find_first_of('/', index); + index = pathIndex == std::string::npos ? size : pathIndex + 1; + std::string dir = path.substr(0, index); + if (access(dir.c_str(), F_OK) < 0 && mkdir(dir.c_str(), mode) < 0) { + HiLog::Error(LABEL, "mkdir %{public}s error", dir.c_str()); + return; + } + } while (index < size); +} + int32_t AppSpawnServer::DoSandboxRootFolderCreate(std::string sandboxPackagePath) { int rc = mount(NULL, "/", NULL, MS_REC | MS_SLAVE, NULL); @@ -754,11 +772,11 @@ int32_t AppSpawnServer::DoSandboxRootFolderCreate(std::string sandboxPackagePath vecInfo.push_back("/sys"); vecInfo.push_back("/sys-prod"); vecInfo.push_back("/system"); - vecInfo.push_back("/mnt"); + vecInfo.push_back("/mnt/hmdfs"); for (int i = 0; i < vecInfo.size(); i++) { tmpDir = sandboxPackagePath + vecInfo[i]; - mkdir(tmpDir.c_str(), FILE_MODE); + Mkdirs(tmpDir.c_str(), FILE_MODE); mountMap[vecInfo[i]] = tmpDir; } diff --git a/src/include/appspawn_server.h b/src/include/appspawn_server.h index 694b3e438af80535e6b63f33ac0c12cdca857470..fae4764f1e4f2ff4155175d175bae4a3fba8bd33 100644 --- a/src/include/appspawn_server.h +++ b/src/include/appspawn_server.h @@ -193,6 +193,8 @@ private: void WaitRebootEvent(); void HandleSignal(); + + void Mkdirs(const std::string &path, mode_t mode); private: const std::string deviceNull_ = "/dev/null"; std::string socketName_ {};