+
+ std::string pkgRoot;
+ if (getRootPath(pkgId, pkgRoot) < 0) {
+ _ERR("Failed to get root path from [%s]", pkgId);
+ return 0;
+ }
+
+ std::string binDir = concatPath(pkgRoot, "bin");
+ std::string tacDir = concatPath(binDir, TAC_SYMLINK_SUB_DIR);
+ if (bf::exists(tacDir)) {
+ uid_t g_uid = 0;
+ gid_t g_gid = 0;
+ if (pkgmgr_installer_info_get_target_uid(&g_uid) < 0) {
+ _ERR("Failed to get UID");
+ return 0;
+ }
+ try {
+ for (auto& symlinkAssembly : bf::recursive_directory_iterator(tacDir)) {
+ std::string symPath = symlinkAssembly.path().string();
+ if (!isNativeImage(symPath)) {
+ std::string originPath = bf::read_symlink(symPath).string();
+ std::string originNiPath = originPath.substr(0, originPath.rfind(".dll")) + ".ni.dll";
+ if (!bf::exists(originNiPath)) {
+ if(createNiDllUnderPkgRoot(pkgId, originPath, 0) != NI_ERROR_NONE) {
+ _ERR("Failed to create NI file [%s]", originPath.c_str());
+ return -1;
+ }
+ }
+ std::string setNiPath = symPath.substr(0, symPath.rfind(".dll")) + ".ni.dll";
+ if (!bf::exists(setNiPath)) {
+ bf::create_symlink(originNiPath, setNiPath);
+ _INFO("%s symbolic link file generated successfully.", setNiPath.c_str());
+ if (lchown(setNiPath.c_str(), g_uid, g_gid)) {
+ _ERR("Failed to change owner of: %s", setNiPath.c_str());
+ return -1;
+ }
+ }
+ }
+ }
+ } catch (const bf::filesystem_error& error) {
+ _ERR("File system error while interating files: %s", error.what());
+ return -1;
+ }
+ }