[1.7][python] File operation API to multibyte filenames fails.

IWAMURO Motonori deenheart@gmail.com
Fri May 8 20:02:00 GMT 2009


2009年5月9日 Corinna Vinschen <corinna-cygwin@cygwin.com>:
> Cool. Thanks for the patch. This actually solves the problem.
> I applied the patch with just a little tweak.

Thanks.
The following patch might be better.
--- a/winsup/cygwin/strfuncs.cc Thu May 07 12:29:17 2009 +0900
+++ b/winsup/cygwin/strfuncs.cc Sat May 09 04:39:49 2009 +0900
@@ -427,7 +427,9 @@
 path names) is transform_chars in path.cc. */
 if ((pw & 0xff00) == 0xf000)
 pw &= 0xff;
+ int eno = errno;
 int bytes = f_wctomb (_REENT, buf, pw, charset, &ps);
+ errno = eno;
 /* Convert chars invalid in the current codepage to a sequence
 ASCII SO; UTF-8 representation of invalid char. */
 if (bytes == -1 && *charset != 'U'/*TF-8*/)
> Nevertheless, it looks like python has a problem as well.  Why does it
> check an errno if the functions returned successfully?  That doesn't
> sound right to me.

When the last readdir returns NULL, python detects the error because
readdir keeps previous errno.
1) ep = readdir(dirp); // ep->d_name == ".", errno == 0
 Python check only ep != NULL. -> OK
2) ep = readdir(dirp); // ep->d_name == "..", errno == 0
 Python check only ep != NULL. -> OK
3) ep = readdir(dirp); // ep->d_name == "\xe3\x82...", errno == 138
 Python check only ep != NULL. -> OK
4) ep = readdir(dirp); // ep->d_name == "\xe3\x83...", errno == 138
 Python check only ep != NULL. -> OK
5) ep = readdir(dirp); // ep == NULL, errno == 138
 Python check ep == NULL and errno != 0. -> Fail!
-- 
IWAMURO Motnori <http://vmi.jp/>
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /