From c84b288cecf1cb4ec4a7bc5221bbc897cd1ab477 Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Sat, 16 Nov 2024 17:00:02 -0800 Subject: [PATCH] Replace use of mktemp with mkstemp Signed-off-by: Tom Rix --- amd/hipcc/src/hipBin_base.h | 43 ++++++++++++++++++++++++++----------- amd/hipcc/src/hipBin_util.h | 29 ------------------------- 2 files changed, 30 insertions(+), 42 deletions(-) diff --git a/amd/hipcc/src/hipBin_base.h b/amd/hipcc/src/hipBin_base.h index 6c1a7767be35..fdb74fd3404b 100644 --- a/amd/hipcc/src/hipBin_base.h +++ b/amd/hipcc/src/hipBin_base.h @@ -24,6 +24,10 @@ THE SOFTWARE. #include "hipBin_util.h" +#include +#include +#include +#include #include #include #include @@ -467,22 +471,35 @@ bool HipBinBase::canRunCompiler(string exeName, string& cmdOut) { string temp_dir = hipBinUtilPtr_->getTempDir(); fs::path templateFs = temp_dir; templateFs /= "canRunXXXXXX"; - string tmpFileName = hipBinUtilPtr_->mktempFile(templateFs.string()); - compilerName += " --version > " + tmpFileName + " 2>&1"; bool executable = false; - if (system(const_cast(compilerName.c_str()))) { - executable = false; - } else { - string myline; - ifstream fp; - fp.open(tmpFileName); - if (fp.is_open()) { - while (std::getline(fp, myline)) { - cmdOut += myline; + string str = templateFs.string(); + int fd = mkstemp(&str[0]); + if (fd >= 0) { + unlink(&str[0]); +#if defined(_WIN32) || defined(_WIN64) + int tmpfd = _dup(STDOUT_FILENO); + int newfd = _dup2(fd, STDOUT_FILENO); +#else + int tmpfd = dup(STDOUT_FILENO); + int newfd = dup2(fd, STDOUT_FILENO); +#endif + if (newfd != -1) { + compilerName += " --version 2>&1"; + if (!system(const_cast(compilerName.c_str()))) { + if (!lseek(newfd, SEEK_SET, 0)) { + char output[128] = {0}; + ssize_t b; + memset(output, 0, 128); + while (read(newfd, &output, 128) > 0) { + cmdOut += output; + memset(output, 0, 128); + } + executable = true; + } } + close(newfd); + dup2(tmpfd, STDOUT_FILENO); } - fp.close(); - executable = true; } return executable; } diff --git a/amd/hipcc/src/hipBin_util.h b/amd/hipcc/src/hipBin_util.h index b4556ef81647..91486e8ded9f 100644 --- a/amd/hipcc/src/hipBin_util.h +++ b/amd/hipcc/src/hipBin_util.h @@ -158,8 +158,6 @@ class HipBinUtil { string replaceWith) const; SystemCmdOut exec(const char* cmd, bool printConsole) const; string getTempDir(); - void deleteTempFiles(); - string mktempFile(string name); string trim(string str) const; string readConfigMap(map hipVersionMap, string keyName, string defaultValue) const; @@ -178,19 +176,6 @@ HipBinUtil *HipBinUtil::instance = 0; // deleting temp files created HipBinUtil::~HipBinUtil() { - deleteTempFiles(); -} - -// create temp file with the template name -string HipBinUtil::mktempFile(string name) { - string fileName; -#if defined(_WIN32) || defined(_WIN64) - fileName = _mktemp(&name[0]); -#else - fileName = mktemp(&name[0]); -#endif - tmpFiles_.push_back(fileName); - return fileName; } // gets the path of the executable name @@ -291,20 +276,6 @@ map HipBinUtil::parseConfigFile(fs::path configPath) const { return configMap; } -// Delete all created temporary files -void HipBinUtil::deleteTempFiles() { - // Deleting temp files vs the temp directory - for (unsigned int i = 0; i < tmpFiles_.size(); i++) { - try { - if (!fs::remove(tmpFiles_.at(i))) - std::cerr << "Error deleting temp name: "<< tmpFiles_.at(i) <