+}
+
+void setCmdName(const std::string& name)
+{
+ #define PRC_NAME_LENGTH 16
+
+ char processName[PRC_NAME_LENGTH] = {0, };
+
+ if (name.empty())
+ return;
+
+ memset(processName, '\0', PRC_NAME_LENGTH);
+ snprintf(processName, PRC_NAME_LENGTH, "%s", name.c_str());
+ prctl(PR_SET_NAME, processName);
+}
+
+std::string getFileName(const std::string& path)
+{
+ std::string ret(path);
+ size_t index = ret.find_last_of(PATH_SEPARATOR);
+ return index == std::string::npos ? ret : ret.substr(index + 1);
+}
+
+std::string SHA256(const std::string& path)
+{
+ std::string output = "";
+ FILE *file = fopen(path.c_str(), "rb");
+ if (!file) {
+ return output;
+ }
+
+ unsigned char hash[SHA256_DIGEST_LENGTH];
+ SHA256_CTX sha256;
+ SHA256_Init(&sha256);
+ int bytesRead = 0;
+ const int bufSize = 32768;
+ char *buffer = (char*)malloc(bufSize);
+ if (!buffer) {
+ fclose(file);
+ return output;
+ }
+
+ while ((bytesRead = fread(buffer, 1, bufSize, file))) {
+ SHA256_Update(&sha256, buffer, bytesRead);
+ }
+ SHA256_Final(hash, &sha256);
+
+ std::stringstream ss;
+ for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
+ ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];
+ }
+ output = ss.str();
+
+ fclose(file);
+ free(buffer);
+
+ return output;
+}
+
+int pkgmgrGetPkgInfo(const std::string& pkgId, pkgmgrinfo_pkginfo_h* handle)
+{
+ uid_t uid = 0;
+ int ret = 0;
+
+ if (pkgmgr_installer_info_get_target_uid(&uid) < 0) {
+ _ERR("Failed to get UID");
+ return -1;
+ }
+
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgId.c_str(), uid, handle);
+ if (ret != PMINFO_R_OK) {
+ _ERR("Failed to get pkginfo (%d)", ret);
+ return -1;
+ }
+
+ return 0;
+}
+
+int pkgmgrGetAppInfo(const std::string& appId, pkgmgrinfo_appinfo_h* handle)
+{
+ uid_t uid = 0;
+ int ret = 0;
+
+ if (pkgmgr_installer_info_get_target_uid(&uid) < 0) {
+ _ERR("Failed to get UID");
+ return -1;
+ }
+
+ ret = pkgmgrinfo_appinfo_get_usr_appinfo(appId.c_str(), uid, handle);
+ if (ret != PMINFO_R_OK) {
+ _ERR("Failed to get appinfo (%d)", ret);
+ return -1;
+ }
+
+ return 0;
+}
+
+int pkgmgrMDFilterForeach(pkgmgrinfo_appinfo_metadata_filter_h handle,
+ pkgmgrinfo_app_list_cb app_cb,
+ void *user_data)
+{
+ uid_t uid = 0;
+ int ret = 0;
+
+ if (pkgmgr_installer_info_get_target_uid(&uid) < 0) {
+ _ERR("Failed to get UID");
+ return -1;
+ }
+
+
+ ret = pkgmgrinfo_appinfo_usr_metadata_filter_foreach(handle, app_cb, user_data, uid);
+ if (ret != PMINFO_R_OK) {
+ _ERR("Failed to execute the metadata filter query (%d)", ret);
+ return -1;
+ }
+
+ return 0;
+}
+
+void printHWClockLog(const char* format, ...)
+{
+ char buf[1024] = {0,};
+ va_list ap;
+
+ va_start(ap, format);
+ vsnprintf(buf, sizeof(buf), format, ap);
+ va_end(ap);
+
+ prctl(PR_TASK_PERF_USER_TRACE, buf, strlen(buf));
+}
+
+const char* getNCDBStartupHook()
+{
+ return "/home/owner/share/tmp/sdk_tools/netcoredbg/ncdbhook.dll";
+}
+
+bool isNCDBStartupHookProvided()
+{
+ char *env = nullptr;
+ env = getenv("DOTNET_STARTUP_HOOKS");
+ if (env == nullptr)
+ return false;
+
+ // Note, `DOTNET_STARTUP_HOOKS` env could provide list of dlls with ':' delimiter,
+ // for example: "/path1/name1.dll:/path2/name2.dll"
+ while (*env != '\0')
+ {
+ const char *ncdbCur = getNCDBStartupHook();
+ while (*ncdbCur != '\0' && *env != '\0' && *env != ':')
+ {
+ if (*ncdbCur != *env)
+ break;
+
+ ncdbCur++;
+ env++;
+
+ if (*ncdbCur == '\0' && (*env == '\0' || *env == ':'))
+ return true;
+ }
+ while (*env != '\0' && *env != ':')
+ {
+ env++;
+ }
+ if (*env == ':')
+ env++;
+ }
+
+ return false;
+}