diff options
| author | Russell Belfer <rb@github.com> | 2012-05-24 13:56:03 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2012-05-24 13:56:03 -0700 |
| commit | 5f60fd009804fbd9886549dc74c04294e3e2cf7a (patch) | |
| tree | bcce30c7afd95d783a12b57641eab3f71da2dfa9 /src/fileops.c | |
| parent | d3e9c4a5fce82e34a91934121addc9b296e74cb8 (diff) | |
| parent | 9e35d7fd6ee0b6dc0008982ab84668fbb2478939 (diff) | |
| download | libgit2-5f60fd009804fbd9886549dc74c04294e3e2cf7a.tar.gz | |
Merge pull request #726 from arrbee/utf16-home-dir
Get user's home dir in UTF-16 clean manner
Diffstat (limited to 'src/fileops.c')
| -rw-r--r-- | src/fileops.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/src/fileops.c b/src/fileops.c index d6960ca1a..6dd9270b5 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -353,13 +353,48 @@ int git_futils_rmdir_r(const char *path, git_directory_removal_type removal_type return error; } +#ifdef GIT_WIN32 +static char *win32_getenv(const wchar_t *name) +{ + char *val_utf8; + wchar_t *val_utf16; + DWORD len = GetEnvironmentVariableW(name, NULL, 0); + + if (len <= 0) + return NULL; + + val_utf16 = git__calloc(len, sizeof(wchar_t)); + if (!val_utf16) + return NULL; + + if (GetEnvironmentVariableW(name, val_utf16, len) != len - 1) { + giterr_set(GITERR_OS, "Could not read environment variable"); + git__free(val_utf16); + return NULL; + } + + val_utf8 = gitwin_from_utf16(val_utf16); + + git__free(val_utf16); + + return val_utf8; +} +#endif + int git_futils_find_global_file(git_buf *path, const char *filename) { - const char *home = getenv("HOME"); + char *home; #ifdef GIT_WIN32 - if (home == NULL) - home = getenv("USERPROFILE"); + home = win32_getenv(L"HOME"); + + if (!home) + home = win32_getenv(L"USERPROFILE"); + + if (home) + git_path_mkposix(home); +#else + home = getenv("HOME"); #endif if (home == NULL) { @@ -371,6 +406,10 @@ int git_futils_find_global_file(git_buf *path, const char *filename) if (git_buf_joinpath(path, home, filename) < 0) return -1; +#ifdef GIT_WIN32 + git__free(home); +#endif + if (git_path_exists(path->ptr) == false) { git_buf_clear(path); return GIT_ENOTFOUND; |
