From 74198af85ea647d6483b643859adae4f2bed330b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar <daniel@zuster.org> Date: Tue, 2 Feb 2010 05:19:57 +0000 Subject: [PATCH] CIndex: Respect TMPDIR/TEMP/TMP when making temporary files for remapping. As a side effect, this also fixes some cases on Windows where the file would end up on a different drive, because tmpnam doesn't include the drive component. PR3837 strikes again. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95067 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/CIndex/CIndexer.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/tools/CIndex/CIndexer.cpp b/tools/CIndex/CIndexer.cpp index 21027999e6..0774ae2f37 100644 --- a/tools/CIndex/CIndexer.cpp +++ b/tools/CIndex/CIndexer.cpp @@ -95,16 +95,38 @@ std::string CIndexer::getClangResourcesPath() { return P.str(); } +static llvm::sys::Path GetTemporaryPath() { + // FIXME: This is lame; sys::Path should provide this function (in particular, + // it should know how to find the temporary files dir). + std::string Error; + const char *TmpDir = ::getenv("TMPDIR"); + if (!TmpDir) + TmpDir = ::getenv("TEMP"); + if (!TmpDir) + TmpDir = ::getenv("TMP"); + if (!TmpDir) + TmpDir = "/tmp"; + llvm::sys::Path P(TmpDir); + P.appendComponent("remap"); + if (P.makeUnique(false, &Error)) + return llvm::sys::Path(""); + + // FIXME: Grumble, makeUnique sometimes leaves the file around!? PR3837. + P.eraseFromDisk(false, 0); + + return P; +} + bool clang::RemapFiles(unsigned num_unsaved_files, struct CXUnsavedFile *unsaved_files, std::vector<std::string> &RemapArgs, std::vector<llvm::sys::Path> &TemporaryFiles) { for (unsigned i = 0; i != num_unsaved_files; ++i) { - char tmpFile[L_tmpnam]; - char *tmpFileName = tmpnam(tmpFile); - // Write the contents of this unsaved file into the temporary file. - llvm::sys::Path SavedFile(tmpFileName); + llvm::sys::Path SavedFile(GetTemporaryPath()); + if (SavedFile.empty()) + return true; + std::string ErrorInfo; llvm::raw_fd_ostream OS(SavedFile.c_str(), ErrorInfo); if (!ErrorInfo.empty()) @@ -120,7 +142,7 @@ bool clang::RemapFiles(unsigned num_unsaved_files, // Remap the file. std::string RemapArg = unsaved_files[i].Filename; RemapArg += ';'; - RemapArg += tmpFileName; + RemapArg += SavedFile.str(); RemapArgs.push_back("-Xclang"); RemapArgs.push_back("-remap-file"); RemapArgs.push_back("-Xclang"); -- 2.40.0