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