Re: [PATCH v7] man/man7/pathname.7: Add file documenting format of pathnames

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jason,

On Mon, Jan 20, 2025 at 10:54:38AM -0500, Jason Yundt wrote:
> On Mon, Jan 20, 2025 at 03:22:05PM +0100, Alejandro Colomar wrote:
> > > +    char *locale_pathname = malloc(locale_pathname_size);
> > > +    if (locale_pathname == NULL) {
> > > +	err(EXIT_FAILURE, "malloc");
> > > +    }
> > > +\&
> > > +    iconv_t cd = iconv_open(nl_langinfo(CODESET), "UTF\-32");
> > > +    if (cd == (iconv_t) \- 1) {
> > > +        err(EXIT_FAILURE, "iconv_open");
> > > +    }
> > > +    char *inbuf = (char *) utf32_pathname;
> > > +    size_t inbytesleft = sizeof utf32_pathname;
> > > +    char *outbuf = locale_pathname;
> > > +    size_t outbytesleft = locale_pathname_size;
> > > +    size_t iconv_result =
> > > +        iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
> > > +    if (iconv_result == \-1) {
> > > +        err(EXIT_FAILURE, "iconv");
> > > +    }
> > > +    // This ensures that the conversion is 100% complete.
> > > +    // See iconv(3) for details.
> > > +    iconv_result =
> > > +        iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
> > > +    if (iconv_result == \-1) {
> > > +        err(EXIT_FAILURE, "iconv");
> > > +    }
> > 
> > Do we really need two calls?  Why?
> 
> iconv(3) says “In each series of calls to iconv(), the last should be
> one with inbuf or *inbuf equal to NULL, in order to flush out any
> partially converted input.”  To me, that quote makes it sound like you
> should always call iconv() at least twice and that inbuf (or *inbuf)
> should be NULL the last time that you call iconv().  I don’t know why
> the man page says that you should always call iconv() at least twice.

I suspect that we can call it just once since we provided enough space.

  The conversion can stop for five reasons:

     •  An invalid multibyte sequence ...

     •  A multibyte sequence is encountered that is valid but  that  cannot  be
        translated to the character encoding of the output.  ...

     •  The  input  byte  sequence  has  been entirely converted, that is, *in‐
        bytesleft has gone down to 0.  In this case, iconv() returns the number
        of nonreversible conversions performed during this call.

     •  An incomplete multibyte sequence is encountered in the input, ...

     •  The  output  buffer  has no more room ...

I don't see anything listed that would make reasonable a second call.
Maybe we should improve the wording in iconv(3), but we should be
careful.  For now I'll leave it untouched.  But please call it only
once.


Cheers,
Alex

-- 
<https://www.alejandro-colomar.es/>

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux