Am 10.09.2011 22:57, schrieb Rich Felker:
> On Sat, Sep 10, 2011 at 10:30:45PM +0200, Matthias Andree wrote:
>> Am 10.09.2011 20:33, schrieb Laurent Bercot:
>>>>> #if !defined __FreeBSD__
>>>>> char *dirname(char *path);
>>>>> #endif
>>>>> Can you confirm that it helps?
>>>> It's bogus because ours is const char *.
>>>
>>> FreeBSD defines dirname as a different function from the standard
>>> and then *busybox* is bogus ?
>>> Please.
>>>
>>> This is the exact kind of bullshit incompatibilities that application
>>> developers should not have to care about, ever. FreeBSD has no business
>>> redefining dirname's prototype; if it's not char *dirname (char *),
>>> it's not conformant, period.
>>
>> FreeBSD's dirname is conforming. Note:
>
> No it is not. The standard specifies the prototype.
Even if, it bears no practical consequence to conformings applications.
>> * Applications (busybox) have no business redeclaring library
>> functions. Instead, they are supposed to include the corresponding
>> headers, dirname.h in this case.
>
> False. 2.1.1 statement 4 reads:
>
> "Provided that a function can be declared without reference to any
> type defined in a header, it is also permissible to declare the
> function explicitly and use it without including its associated
=============================================
> header."
==========
Please view with monospaced/fixed-character-width font to see my
underlines above at the right location.
> POSIX explicitly blesses the practice of manually declaring the
> functions you wish to use.
Yes, provided that you "use it without including its associated header".
Reason quoted below.
>> * POSIX conforming applications using dirname() need not be changed
>> for use with FreeBSD's dirname() implementation.
>
> The following application is a strictly conforming POSIX application:
>
> #define _POSIX_C_SOURCE 200809L
> #include <libgen.h>
> char *dirname(char *);
The application is nonconforming because the permission to declare the
functions yourself applies if you do NOT include the header.
Mind statement 2 from the same section that you cited, which begins:
"Any function declared in a header may also be implemented as a macro
defined in the header, so a function should not be declared explicitly
if its header is included. (...)".
> It will not compile on FreeBSD due to a BUG IN FREEBSD!
False. It does not compile because is nonconforming.
>> FreeBSD waives the former and implements the latter. And because it
>> does not modify the string, it advertises so through its header by
>> adding the const keyword. The standard cannot do that because it
>> permits modification of the string.
>
> Implementation choices are irrelevant to the requirements on the
> function signature.
Possibly - presumably FreeBSD's implementation predates The Open Group
Base Specifications Issue 5 that was the first to change the prototype
from const char * to char *.
Let's not forget that the underlying bug was that some compilation units
were using dirname() without either declaring it first or #include
<libgen.h>.
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox