Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/eglib
diff options
context:
space:
mode:
authorNiklas Therning <niklas@therning.org>2016-09-02 22:52:57 +0300
committerNiklas Therning <niklas@therning.org>2016-09-03 23:10:59 +0300
commit16bfa4ec2f4623ba843f7a575169e3df8b5eea8d (patch)
tree51fc0fd39c58c5bdcdadaa284b6ddeb6fb26f4f3 /eglib
parent5589845bf38b67d7566907ddcc6c9fb6b2c8c069 (diff)
Prefer SHGetKnownFolderPath() in g_get_home_dir() over HOMEDRIVE/HOMEPATH
environment variables Relying on the HOMEDRIVE/HOMEPATH environment variables is fragile as those variables don't always have to be set. One such scenario is when running on a Jenkins slave. When not set g_get_home_dir() in eglib would return NULL which led to a crash in ves_icall_System_Environment_InternalGetHome(). This patch changes g_get_home_dir() to first try to call SHGetKnownFolderPath() to get the current user's profile directory (i.e. home dir). If that fails it falls back to the USERPROFILE environment variable. If that isn't available the function will fallback to the original behavior and try with HOMEDRIVE/HOMEPATH.
Diffstat (limited to 'eglib')
-rw-r--r--eglib/src/gmisc-win32.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/eglib/src/gmisc-win32.c b/eglib/src/gmisc-win32.c
index 9486aff07e3..5baec653c33 100644
--- a/eglib/src/gmisc-win32.c
+++ b/eglib/src/gmisc-win32.c
@@ -30,6 +30,9 @@
#include <glib.h>
#include <windows.h>
+#ifdef _MSC_VER
+#include <shlobj.h>
+#endif
#include <direct.h>
#include <io.h>
@@ -116,20 +119,34 @@ g_path_is_absolute (const char *filename)
const gchar *
g_get_home_dir (void)
{
- /* FIXME */
- const gchar *drive = g_getenv ("HOMEDRIVE");
- const gchar *path = g_getenv ("HOMEPATH");
gchar *home_dir = NULL;
-
- if (drive && path) {
- home_dir = g_malloc(strlen(drive) + strlen(path) +1);
- if (home_dir) {
- sprintf(home_dir, "%s%s", drive, path);
- }
+
+#ifdef _MSC_VER
+ PWSTR profile_path = NULL;
+ HRESULT hr = SHGetKnownFolderPath (&FOLDERID_Profile, KF_FLAG_DEFAULT, NULL, &profile_path);
+ if (SUCCEEDED(hr)) {
+ home_dir = u16to8 (profile_path);
+ CoTaskMemFree (profile_path);
+ }
+#endif
+
+ if (!home_dir) {
+ home_dir = (gchar *) g_getenv ("USERPROFILE");
}
- g_free (drive);
- g_free (path);
+ if (!home_dir) {
+ const gchar *drive = g_getenv ("HOMEDRIVE");
+ const gchar *path = g_getenv ("HOMEPATH");
+
+ if (drive && path) {
+ home_dir = g_malloc (strlen (drive) + strlen (path) + 1);
+ if (home_dir) {
+ sprintf (home_dir, "%s%s", drive, path);
+ }
+ }
+ g_free (drive);
+ g_free (path);
+ }
return home_dir;
}