diff options
author | Pawel Bylica <chfast@gmail.com> | 2015-11-06 23:44:23 +0000 |
---|---|---|
committer | Pawel Bylica <chfast@gmail.com> | 2015-11-06 23:44:23 +0000 |
commit | 6e680b2be7e2af65fa054a61133f4930844975a4 (patch) | |
tree | 635c3c1cb2aa86ef79839afe0a25c13ad1492835 /llvm/lib | |
parent | b43221439c6e57c90dd231cba0c12ace0aee73c7 (diff) | |
download | bcm5719-llvm-6e680b2be7e2af65fa054a61133f4930844975a4.tar.gz bcm5719-llvm-6e680b2be7e2af65fa054a61133f4930844975a4.zip |
Revert r252366: [Support] Use GetTempDir to get the temporary dir path on Windows.
llvm-svn: 252367
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Support/Windows/Path.inc | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc index c787dc2a3f8..49910af55a7 100644 --- a/llvm/lib/Support/Windows/Path.inc +++ b/llvm/lib/Support/Windows/Path.inc @@ -773,22 +773,49 @@ bool home_directory(SmallVectorImpl<char> &result) { return getKnownFolderPath(FOLDERID_Profile, result); } +static bool getTempDirEnvVar(const char *Var, SmallVectorImpl<char> &Res) { + SmallVector<wchar_t, 128> NameUTF16; + if (windows::UTF8ToUTF16(Var, NameUTF16)) + return false; + + SmallVector<wchar_t, 1024> 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<char> &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<char> &Result) { (void)ErasedOnReboot; + Result.clear(); - 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; - } + // Check whether the temporary directory is specified by an environment + // variable. + if (getTempDirEnvVar(Result)) + return; // Fall back to a system default. const char *DefaultResult = "C:\\TEMP"; - Result.clear(); Result.append(DefaultResult, DefaultResult + strlen(DefaultResult)); } } // end namespace path |