delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2009/05/08/16:30:39

X-Recipient: archive-cygwin AT delorie DOT com
X-Spam-Check-By: sourceware.org
Date: Fri, 8 May 2009 22:30:10 +0200
From: Corinna Vinschen <corinna-cygwin AT cygwin DOT com>
To: cygwin AT cygwin DOT com
Subject: Re: [1.7][python] File operation API to multibyte filenames fails.
Message-ID: <20090508203010.GP21324@calimero.vinschen.de>
Reply-To: cygwin AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
References: <3f0ad08d0905080602s36a9eddg852eaa3ea3a2a69f AT mail DOT gmail DOT com> <20090508130901 DOT GL21324 AT calimero DOT vinschen DOT de> <3f0ad08d0905080621j2b1f97b9p317ee1df0f1dfc76 AT mail DOT gmail DOT com> <20090508160415 DOT GM21324 AT calimero DOT vinschen DOT de> <3f0ad08d0905081221s670f165ap507d74f129954579 AT mail DOT gmail DOT com> <20090508193905 DOT GO21324 AT calimero DOT vinschen DOT de> <3f0ad08d0905081302p12091827r44e99f04c067df9f AT mail DOT gmail DOT com>
MIME-Version: 1.0
In-Reply-To: <3f0ad08d0905081302p12091827r44e99f04c067df9f@mail.gmail.com>
User-Agent: Mutt/1.5.19 (2009-02-20)
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

On May  9 05:02, IWAMURO Motonori wrote:
> 2009/5/9 Corinna Vinschen <corinna-cygwin AT cygwin DOT 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*/)

Thanks.  I implemented that differently by just storing and restoring
the errno value at function entry and exit.  The sys_wcstombs and
sys_mbstowcs functions are not supposed to set errno anyway.

> > 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!

Ouch, right.  It shows that I'm tired.


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

--
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/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019