+CompatibilityManager::PrepareVirtualRoot(const Tizen::Base::String& rootPath, const Tizen::App::PackageId& packageId)
+{
+ result r = E_SUCCESS;
+ bool res = true;
+ int result = 0;
+ char* pCwd = null;
+ String destPath = rootPath + DIR_VIRTUAL_ROOT;
+ SmackManager smackManager;
+
+ std::unique_ptr<char[]> pVirtualRootPath(_StringConverter::CopyToCharArrayN(destPath));
+ TryCatch(pVirtualRootPath != null, res = false, "The memory is insufficient.");
+
+ pCwd = get_current_dir_name();
+ TryCatch(pCwd != null, res = false, "get_current_dir_name() failed. [errno = %d(%s)]", errno, strerror(errno));
+
+ // appRoot/virtual-root
+ if (File::IsFileExist(destPath) == false)
+ {
+ r = Directory::Create(destPath, false);
+ TryCatch(!IsFailed(r), res = false, "Directory::Create() failed");
+ }
+
+ InstallerUtil::ChangeDirectoryPermission(destPath, PERM_BASE, true);
+
+ result = chdir(pVirtualRootPath.get());
+ TryCatch(result == 0, res = false, "chdir(%s) failed. [errno = %d(%s)]", pVirtualRootPath.get(), errno, strerror(errno));
+
+ res = CreateVirtualRootDirectories();
+ TryCatch(res == true, , "CreateVirtualRootDirectories() failed.");
+
+ smackManager.AddLabelDir(packageId, destPath);
+
+ res = CreateSymbolicLink();
+ TryCatch(res == true, , "CreateSymbolicLink() failed.");
+
+ result = chdir(pCwd);
+ TryCatch(result == 0, res = false, "chdir(%s) failed. [errno = %d(%s)]", pCwd, errno, strerror(errno));
+
+CATCH:
+ if (pCwd)
+ {
+ free(pCwd);
+ }
+
+ AppLog("[Tizen::Io] result = [%s]", res?"true":"false");
+
+ return res;
+}
+
+bool
+CompatibilityManager::FinalizeVirtualRoot(const String& rootPath)
+{
+ int res = 0;
+ unsigned int i = 0;
+ String destPath = rootPath + DIR_VIRTUAL_ROOT;
+ static const struct _PathInfo mountPath[] =
+ {
+ { "./bin" },
+ { "./cache" },
+ { "./csa" },
+ { "./data" },
+ { "./dev" },
+ { "./etc" },
+ { "./lib" },
+ { "./media" },
+ { "./mnt" },
+ { "./opt" },
+ { "./proc" },
+ { "./run" },
+ { "./sbin" },
+ { "./smack" },
+ { "./srv" },
+ { "./sys" },
+ { "./system" },
+ { "./tmp" },
+ { "./usr" },
+ { "./var" }
+ };
+
+ std::unique_ptr<char[]> pVirtualRootPath(_StringConverter::CopyToCharArrayN(destPath));
+ TryReturn(pVirtualRootPath, false, "The memory is insufficient.");
+
+ res = chdir(pVirtualRootPath.get());
+ TryReturn(res == 0, false, "chdir() failed. (%d, %s), path = [%ls]", errno, strerror(errno), destPath.GetPointer());
+
+ for (i = 0; i < sizeof(mountPath) / sizeof(struct _PathInfo); ++i)
+ {
+ res = umount2(mountPath[i].destPath, MNT_DETACH);
+ TryReturn((res == 0) || (errno == EINVAL) || (errno == ENOENT), false, "umount2() failed. (%d, %s), path = [%s]", errno, strerror(errno), mountPath[i].destPath);
+ }
+
+ AppLog("[Tizen::Io] FinalizeVirtualRoot() succeeded, path: %ls", destPath.GetPointer());
+ return true;
+}
+
+bool