From ee42ccd3a2c71ddf73a7b58cdf7ce8afdd0da5dd Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 21 Sep 2009 19:29:16 +0000 Subject: * cygheap.h (cwdstuff::get_posix): Convert to const inline method just returning pointer to posix path. (cwdstuff::reset_posix): Convert to non-inline method taking a wchar_t pointer. * path.cc (cwdstuff::set): Revert change from 2009-05-13. Set posix to valid incoming path again. (cwdstuff::reset_posix): New implementation setting posix path from incoming wchar_t path. Explain usage. (cwdstuff::get_posix): Drop implementation. (cwdstuff::get): Drop special case to handle empty posix path. * syscalls.cc (internal_setlocale): Store old posix cwd as wide char path. Restore posix cwd using new charset. Explain why. --- winsup/cygwin/syscalls.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'winsup/cygwin/syscalls.cc') diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index e86163886..a436afd52 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -4063,6 +4063,16 @@ unlinkat (int dirfd, const char *pathname, int flags) static char * internal_setlocale (char *ret) { + tmp_pathbuf tp; + + /* Each setlocale potentially changes the multibyte representation + of the CWD. Therefore we have to reevaluate the CWD's posix path and + store in the new charset. */ + /* FIXME: Other buffered paths might be affected as well. */ + wchar_t *w_cwd = tp.w_get (); + cwdstuff::cwd_lock.acquire (); + sys_mbstowcs (w_cwd, 32768, cygheap->cwd.get_posix ()); + if (*__locale_charset () == 'A') { cygheap->locale.mbtowc = __utf8_mbtowc; @@ -4097,11 +4107,10 @@ internal_setlocale (char *ret) cygheap->locale.wctomb = __wctomb; } strcpy (cygheap->locale.charset, __locale_charset ()); - /* Each setlocale potentially changes the multibyte representation - of the CWD. Therefore we have to reset the CWD's posix path and - reevaluate the next time it's used. */ - /* FIXME: Other buffered paths might be affected as well. */ - cygheap->cwd.reset_posix (); + + /* See above. */ + cygheap->cwd.reset_posix (w_cwd); + cwdstuff::cwd_lock.release (); return ret; } -- cgit v1.2.3