* 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.
This commit is contained in:
Corinna Vinschen
2009-09-21 19:29:16 +00:00
parent 92763ad9ba
commit ee42ccd3a2
4 changed files with 40 additions and 29 deletions

View File

@@ -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;
}