From d43fc120ac0ced07550d133a708330af311013ea Mon Sep 17 00:00:00 2001 From: Cho Woong Suk Date: Mon, 2 Apr 2018 20:25:56 +0900 Subject: [PATCH] add command to nitool to remove system and app ni Change-Id: I0b223900bfcdc708706c79920721acaa761a0aa6 --- NativeLauncher/installer-plugin/common.cc | 56 +++++++++++++++++++++++++++++++ NativeLauncher/installer-plugin/common.h | 2 ++ NativeLauncher/installer-plugin/nitool.cc | 15 +++++++++ 3 files changed, 73 insertions(+) diff --git a/NativeLauncher/installer-plugin/common.cc b/NativeLauncher/installer-plugin/common.cc index f1d212e..7d826db 100644 --- a/NativeLauncher/installer-plugin/common.cc +++ b/NativeLauncher/installer-plugin/common.cc @@ -255,6 +255,40 @@ static void createCoreLibNI() } } +void removeNiUnderDirs(const char* rootPaths[], int count) +{ + auto convert = [](const char* path, const char* name) { + std::string ni; + if (isNativeImage(path)) { + remove(path); + } + }; + + for (int i = 0; i < count; i++) + scanFilesInDir(rootPaths[i], convert, -1); +} + +void removeNiPlatform() +{ + std::string coreLib = concatPath(__RUNTIME_DIR, "System.Private.CoreLib.dll"); + std::string niCoreLib = concatPath(__RUNTIME_DIR, "System.Private.CoreLib.ni.dll"); + std::string coreLibBackup = concatPath(__RUNTIME_DIR, "System.Private.CoreLib.dll.Backup"); + + if (fileNotExist(coreLibBackup)) { + return; + } + + if (remove(coreLib.c_str())) { + _ERR("Failed to remove System.Private.CoreLib native image file"); + } + + rename(coreLibBackup.c_str(), coreLib.c_str()); + + const char* platformDirs[] = {__RUNTIME_DIR, __DEVICE_API_DIR, "/usr/bin"}; + + removeNiUnderDirs(platformDirs, 3); +} + void createNiPlatform() { createCoreLibNI(); @@ -334,6 +368,28 @@ void createNiUnderDirs(const char* rootPaths[], int count) createNiUnderDirs(rootPaths, count, nullptr); } +int removeNiUnderPkgRoot(const char* pkgName) +{ + std::string pkgRoot; + if (getRootPath(pkgName, pkgRoot) < 0) + return 1; + + std::string binDir = concatPath(pkgRoot, "bin"); + std::string libDir = concatPath(pkgRoot, "lib"); + _INFO("bindir : %s", binDir.c_str()); + _INFO("libdir : %s", libDir.c_str()); + + const char* paths[] = { + binDir.c_str(), + libDir.c_str() + }; + + removeNiUnderDirs(paths, 2); + + return 0; +} + + int createNiUnderPkgRoot(const char* pkgName) { std::string pkgRoot; diff --git a/NativeLauncher/installer-plugin/common.h b/NativeLauncher/installer-plugin/common.h index d36ae69..941f5b1 100644 --- a/NativeLauncher/installer-plugin/common.h +++ b/NativeLauncher/installer-plugin/common.h @@ -26,5 +26,7 @@ void createNiUnderDirs(const char* rootPaths[], int count); int createNiUnderPkgRoot(const char* pkgName); void createNiPlatform(); void createNiSelect(const char* dllPath); +void removeNiPlatform(); +int removeNiUnderPkgRoot(const char* pkgName); #endif /* __INSTALLER_PLUGIN_COMMON_H__ */ diff --git a/NativeLauncher/installer-plugin/nitool.cc b/NativeLauncher/installer-plugin/nitool.cc index c34a696..081d638 100644 --- a/NativeLauncher/installer-plugin/nitool.cc +++ b/NativeLauncher/installer-plugin/nitool.cc @@ -45,6 +45,8 @@ static void help(const char *argv0) " --system - Create NI under System DLLs\n" " --dll - Create NI for DLL\n" " --pkg - Create NI for package\n" + " --reset-system - Remove System NI files\n" + " --reset-pkg - Remove App NI files\n" "\n" "Example:\n" "Create native image for dlls and exes under platform directories\n" @@ -60,6 +62,7 @@ int main(int argc, char* argv[]) { bool pkgMode = false; bool dllMode = false; + bool rmPkgMode = false; if (cmdOptionExists(argv, argv+argc, "--help")) { help(argv[0]); @@ -71,6 +74,11 @@ int main(int argc, char* argv[]) dllMode = true; } else if (cmdOptionExists(argv, argv+argc, "--pkg")) { pkgMode = true; + } else if (cmdOptionExists(argv, argv+argc, "--reset-system")) { + removeNiPlatform(); + return 0; + } else if (cmdOptionExists(argv, argv+argc, "--reset-pkg")) { + rmPkgMode = true; } else { help(argv[0]); return 1; @@ -94,6 +102,13 @@ int main(int argc, char* argv[]) return 1; } } + } else if (rmPkgMode) { + for (const char* pkg : args) { + if (removeNiUnderPkgRoot(pkg) != 0) { + fprintf(stderr, "Failed to get root path from [%s]\n", pkg); + return 1; + } + } } else if (dllMode) { for (const char* dll : args) createNiSelect(dll); -- 2.7.4