summaryrefslogtreecommitdiff
path: root/src/fileops.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-05-24 13:56:03 -0700
committerRussell Belfer <rb@github.com>2012-05-24 13:56:03 -0700
commit5f60fd009804fbd9886549dc74c04294e3e2cf7a (patch)
treebcce30c7afd95d783a12b57641eab3f71da2dfa9 /src/fileops.c
parentd3e9c4a5fce82e34a91934121addc9b296e74cb8 (diff)
parent9e35d7fd6ee0b6dc0008982ab84668fbb2478939 (diff)
downloadlibgit2-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.c45
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;