From b43221439c6e57c90dd231cba0c12ace0aee73c7 Mon Sep 17 00:00:00 2001 From: Pawel Bylica Date: Fri, 6 Nov 2015 23:21:49 +0000 Subject: [Support] Use GetTempDir to get the temporary dir path on Windows. Summary: In general GetTempDir follows the same logic as the replaced code: checks env variables TMP, TEMP, USERPROFILE in order. However, it also perform other checks like making separators native (\), making the path absolute, etc. This change fixes FileSystemTest.CreateDir unittest that had been failing when run from Unix-like shell on Windows (Unix-like path separator (/) used in env variables). Reviewers: chapuni, rafael, aaron.ballman Subscribers: rafael, llvm-commits Differential Revision: http://reviews.llvm.org/D14231 llvm-svn: 252366 --- llvm/lib/Support/Windows/Path.inc | 47 +++++++++------------------------------ 1 file changed, 10 insertions(+), 37 deletions(-) (limited to 'llvm/lib/Support') diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc index 49910af55a7..c787dc2a3f8 100644 --- a/llvm/lib/Support/Windows/Path.inc +++ b/llvm/lib/Support/Windows/Path.inc @@ -773,49 +773,22 @@ bool home_directory(SmallVectorImpl &result) { return getKnownFolderPath(FOLDERID_Profile, result); } -static bool getTempDirEnvVar(const char *Var, SmallVectorImpl &Res) { - SmallVector NameUTF16; - if (windows::UTF8ToUTF16(Var, NameUTF16)) - return false; - - SmallVector Buf; - size_t Size = 1024; - do { - Buf.reserve(Size); - Size = - GetEnvironmentVariableW(NameUTF16.data(), Buf.data(), Buf.capacity()); - if (Size == 0) - return false; - - // Try again with larger buffer. - } while (Size > Buf.capacity()); - Buf.set_size(Size); - - if (windows::UTF16ToUTF8(Buf.data(), Size, Res)) - return false; - return true; -} - -static bool getTempDirEnvVar(SmallVectorImpl &Res) { - const char *EnvironmentVariables[] = {"TMP", "TEMP", "USERPROFILE"}; - for (const char *Env : EnvironmentVariables) { - if (getTempDirEnvVar(Env, Res)) - return true; - } - return false; -} - void system_temp_directory(bool ErasedOnReboot, SmallVectorImpl &Result) { (void)ErasedOnReboot; - Result.clear(); - // Check whether the temporary directory is specified by an environment - // variable. - if (getTempDirEnvVar(Result)) - return; + wchar_t Path[MAX_PATH + 2]; // GetTempPath can return MAX_PATH + 1 + null + if (auto PathLength = ::GetTempPathW(sizeof(Path) / sizeof(wchar_t), Path)) { + assert(PathLength > 0 && PathLength <= (MAX_PATH + 1) && + "GetTempPath returned undocumented result"); + if (Path[PathLength - 1] == L'\\') + --PathLength; // skip trailing "\" added by GetTempPath + if (!UTF16ToUTF8(Path, PathLength, Result)) + return; + } // Fall back to a system default. const char *DefaultResult = "C:\\TEMP"; + Result.clear(); Result.append(DefaultResult, DefaultResult + strlen(DefaultResult)); } } // end namespace path -- cgit v1.2.3