From ae9d96865d769a68064d20ccbb6911fbab2af2a1 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Thu, 30 Dec 2004 17:48:23 +0000 Subject: [PATCH] Use GetCurrentDirectory() directly for simpler buffer length management. I 2004-12-30 Tor Lillqvist * glib/gutils.c (g_get_current_dir): Use GetCurrentDirectory() directly for simpler buffer length management. I don't trust getcwd() getting it right all the time. --- ChangeLog | 6 +++++ ChangeLog.pre-2-10 | 6 +++++ ChangeLog.pre-2-12 | 6 +++++ ChangeLog.pre-2-6 | 6 +++++ ChangeLog.pre-2-8 | 6 +++++ glib/gutils.c | 60 +++++++++++++++++++++++++++++----------------- 6 files changed, 68 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7890b77b3..7e3b1bd76 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_get_current_dir): Use GetCurrentDirectory() + directly for simpler buffer length management. I don't trust + getcwd() getting it right all the time. + 2004-12-30 Matthias Clasen * glib/gfileutils.c (g_file_test): Typo fix. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 7890b77b3..7e3b1bd76 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_get_current_dir): Use GetCurrentDirectory() + directly for simpler buffer length management. I don't trust + getcwd() getting it right all the time. + 2004-12-30 Matthias Clasen * glib/gfileutils.c (g_file_test): Typo fix. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 7890b77b3..7e3b1bd76 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,9 @@ +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_get_current_dir): Use GetCurrentDirectory() + directly for simpler buffer length management. I don't trust + getcwd() getting it right all the time. + 2004-12-30 Matthias Clasen * glib/gfileutils.c (g_file_test): Typo fix. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 7890b77b3..7e3b1bd76 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_get_current_dir): Use GetCurrentDirectory() + directly for simpler buffer length management. I don't trust + getcwd() getting it right all the time. + 2004-12-30 Matthias Clasen * glib/gfileutils.c (g_file_test): Typo fix. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 7890b77b3..7e3b1bd76 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_get_current_dir): Use GetCurrentDirectory() + directly for simpler buffer length management. I don't trust + getcwd() getting it right all the time. + 2004-12-30 Matthias Clasen * glib/gfileutils.c (g_file_test): Typo fix. diff --git a/glib/gutils.c b/glib/gutils.c index 92ad21612..f9fb93127 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -718,6 +718,44 @@ g_path_get_dirname (const gchar *file_name) gchar* g_get_current_dir (void) { +#ifdef G_OS_WIN32 + + gchar *dir = NULL; + + if (G_WIN32_HAVE_WIDECHAR_API ()) + { + wchar_t dummy[2], *wdir; + int len; + + len = GetCurrentDirectoryW (2, dummy); + wdir = g_new (wchar_t, len); + + if (GetCurrentDirectoryW (len, wdir) == len - 1) + dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL); + + g_free (wdir); + } + else + { + gchar dummy[2], *cpdir; + int len; + + len = GetCurrentDirectoryA (2, dummy); + cpdir = g_new (gchar, len); + + if (GetCurrentDirectoryA (len, cpdir) == len - 1) + dir = g_locale_to_utf8 (cpdir, -1, NULL, NULL, NULL); + + g_free (cpdir); + } + + if (dir == NULL) + dir = g_strdup ("\\"); + + return dir; + +#else + gchar *buffer = NULL; gchar *dir = NULL; static gulong max_len = 0; @@ -725,28 +763,6 @@ g_get_current_dir (void) if (max_len == 0) max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH; -#ifdef G_OS_WIN32 - if (G_WIN32_HAVE_WIDECHAR_API ()) - { - wchar_t *wdir = _wgetcwd (NULL, max_len); - if (wdir) - dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL); - else - dir = g_strdup (G_DIR_SEPARATOR_S); - free (wdir); - } - else - { - char *cpdir = getcwd (NULL, max_len); - if (cpdir) - dir = g_locale_to_utf8 (cpdir, -1, NULL, NULL, NULL); - else - dir = g_strdup (G_DIR_SEPARATOR_S); - free (cpdir); - } - - return dir; -#else /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd") * and, if that wasn't bad enough, hangs in doing so. */