Subject: Re: HEADS UP: iconv(3) prototype was changed
To: T.SHIOZAKI <tshiozak@NetBSD.org>
From: Paulo Alexandre Pinto Pires <p@ppires.org>
List: current-users
Date: 08/02/2004 08:26:52
T.SHIOZAKI wrote:
>I changed the iconv(3) function interface to follow the POSIX specification;
>the 2nd argument is changed to "char ** restrict" instead of
>"const char ** restricted".
>For the details, see the thread called "iconv(3) prototype" in
>the tech-kern@ list (from 07/26/2004):
> http://mail-index.netbsd.org/tech-userlevel/2004/07/
>
>This change may make some programs (including pkgsrc-ed ones) unable to
>be built. Please change such programs if necessary.
>
>BTW, I will request to pull up it to 2.0 one of these days.
>
>--
>Takuya SHIOZAKI
>
Unfortunately, the first thing that doesn't build is NetBSD itself
(linintl)...
I understand and most often advocate adherence to standards, but isn't
POSIX just semantically *wrong* in this case? I wouldn't be surprised
if a future revision of SUS/POSIX would actually fix this, especially
when big players in the UNIX{,-like} market, like Solaris and Linux, do
what makes more sense. I have read the discussion on tech-userland, but
cannot avoid quoting NetBSD's own statement at
<http://www.netbsd.org/Goals/standards.html>: "NetBSD is extremely close
to being POSIX.1 compliant (...). There are a few nits we know about:
some we plan to fix, and others we plan to ignore until a future
revision of POSIX ``fixes'' them for us."
Please notice that, unless converting statically compiled strings, the
second argument to iconv() is very likely to be a second pointer into
somewhere in a buffer whose head pointer is in another variable (which,
in real world applications, has probably come from malloc() at some
point). If buffer is (char *), it is clean and safe to have "const char
*sec_ptr=buffer; iconv(cd, &sec_ptr,...);", as we used to do. However,
if buffer is (const char *), it is unclean and potentially unsafe to
write "char *sec_ptr=(char *)buffer; iconv(cd, sec_ptr,...);",as POSIX
would require.
So far, this move is just making NetBSD less compatible with real world
existing implementations and applications. I don't know if the the
additional work of porting non-compliant but otherwise correct
applications would pay off. I don't have access to AIX or HPUX machines
to know if they adhere to POSIX here, but I have the feeling that the
majority of the applications we port to NetBSD are not developed in
those two, anyway.
Best regards,
--
Pappires
... Qui habet aurem audiat quid Spiritus dicat ecclesiis.