summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc31
1 files changed, 9 insertions, 22 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index db514d325..223cc2331 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -3306,8 +3306,8 @@ cwdstuff::set (PUNICODE_STRING nat_cwd, const char *posix_cwd, bool doit)
posix_cwd = (const char *) tp.c_get ();
mount_table->conv_to_posix_path (win32.Buffer, (char *) posix_cwd, 0);
}
- if (posix)
- posix[0] = '\0';
+ posix = (char *) crealloc_abort (posix, strlen (posix_cwd) + 1);
+ stpcpy (posix, posix_cwd);
}
out:
@@ -3315,20 +3315,14 @@ out:
return res;
}
-/* Copy the value for either the posix or the win32 cwd into a buffer. */
-char *
-cwdstuff::get_posix ()
+/* Store incoming wchar_t path as current posix cwd. This is called from
+ setlocale so that the cwd is always stored in the right charset. */
+void
+cwdstuff::reset_posix (wchar_t *w_cwd)
{
- if (!posix || !*posix)
- {
- tmp_pathbuf tp;
-
- char *tocopy = tp.c_get ();
- mount_table->conv_to_posix_path (win32.Buffer, tocopy, 0);
- posix = (char *) crealloc_abort (posix, strlen (tocopy) + 1);
- stpcpy (posix, tocopy);
- }
- return posix;
+ size_t len = sys_wcstombs (NULL, (size_t) -1, w_cwd);
+ posix = (char *) crealloc_abort (posix, len + 1);
+ sys_wcstombs (posix, len + 1, w_cwd);
}
char *
@@ -3356,13 +3350,6 @@ cwdstuff::get (char *buf, int need_posix, int with_chroot, unsigned ulen)
sys_wcstombs (tocopy, NT_MAX_PATH, win32.Buffer,
win32.Length / sizeof (WCHAR));
}
- else if (!posix || !*posix)
- {
- tocopy = tp.c_get ();
- mount_table->conv_to_posix_path (win32.Buffer, tocopy, 0);
- posix = (char *) crealloc_abort (posix, strlen (tocopy) + 1);
- stpcpy (posix, tocopy);
- }
else
tocopy = posix;