diff options
| author | Pawel Bylica <chfast@gmail.com> | 2015-11-06 23:21:49 +0000 |
|---|---|---|
| committer | Pawel Bylica <chfast@gmail.com> | 2015-11-06 23:21:49 +0000 |
| commit | b43221439c6e57c90dd231cba0c12ace0aee73c7 (patch) | |
| tree | afda6be221219c5228f24f5d530ef386a9f959c3 /llvm/lib/Support | |
| parent | 472d937db78109b67629eb6827424810c8002e8c (diff) | |
| download | bcm5719-llvm-b43221439c6e57c90dd231cba0c12ace0aee73c7.tar.gz bcm5719-llvm-b43221439c6e57c90dd231cba0c12ace0aee73c7.zip | |
[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
Diffstat (limited to 'llvm/lib/Support')
| -rw-r--r-- | llvm/lib/Support/Windows/Path.inc | 47 |
1 files changed, 10 insertions, 37 deletions
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<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(); - // 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 |

