[libbdplus-devel] POSIX does not include fseeko/ftello

Thomas Klausner tk at giga.or.at
Tue Mar 24 09:25:22 CET 2015


Hi Petri!

Thanks for your reply.

On Fri, Mar 20, 2015 at 11:47:28AM +0200, Petri Hintukainen wrote:
> On ke, 2015-02-18 at 11:06 +0100, Thomas Klausner wrote:
> 
> Are you subscribed to the list ? (it took ~ month for your message to
> get thru)

No, I'm not subscribed. I just wanted to report a bug ;)

> > On Wed, Feb 18, 2015 at 10:56:09AM +0100, Thomas Klausner wrote:
> > > On Wed, Feb 18, 2015 at 10:28:39AM +0100, Jean-Baptiste Kempf wrote:
> > > > On 01 Feb, Thomas Klausner wrote :
> > > > > According to the NetBSD man page, fseeko and ftello conform to X/Open
> > > > > System Interfaces and Headers Issue 5 (``XSH5'').
> 
> Yes. POSIX-1.2001 (IEEE Std 1003.1-2001) was based on XHS5. According to Linux
> man pages (rel. 3.65) fseeko and ftello conform to POSIX.1-2001.
> 
> > > > > libbdplus tries to
> > > > > compile with -D_POSIX_C_SOURCE=200112L, which, on NetBSD, hides X/Open
> > > > > symbols that are not in POSIX, like fseeko and ftello.
> 
> The problem seems to be in NetBSD stdio.h.
> 
> From IEEE Std 1003.1-2001:
> 
> Base Definitions, chapter 13, stdio.h:
> <<
>    The following shall be declared as functions and may also be
>    defined as macros. Function prototypes shall be provided.
> ...
>    [CX]    int fseeko(FILE *, off_t, int);
>    [CX]    off_t ftello(FILE *);
> >>
> <<
>    CX Extension to the ISO C standard
>       The functionality described is an extension to 
>       the ISO C standard. Application writers may make
>       use of an extension as it is supported on all
>       IEEE Std 1003.1-2001-conforming systems.
> >>
> 
> System Interfaces, 2.2.1.1:
> <<
>    The _POSIX_C_SOURCE Feature Test Macro
>       A POSIX-conforming application should ensure that the feature
>       test macro _POSIX_C_SOURCE is defined before inclusion of any
>       header. When an application includes a header described by
>       IEEE Std 1003.1-2001, and when this feature test macro is
>       defined to have the value 200112L:
>       1. All symbols required by IEEE Std 1003.1-2001 to appear
>          when the header is included shall be made visible.
>       ...
> >>
> 
> So, unless I get it wrong (I didn't read full specs :) both functions
> are required in POSIX.1-2001 conforming stdio.h when _POSIX_C_SOURCE is
> 200112L.

I've discussed this on the NetBSD mailing list and there was agreement
with this statement, so I've fixed it in the NetBSD headers.

http://mail-index.netbsd.org/source-changes/2015/03/24/msg064236.html

> Also, defining _POSIX_C_SOURCE is not optional.

There was disagreement with this part though:

http://mail-index.netbsd.org/current-users/2015/03/23/msg026951.html

> > > > What define can we do to show them?
> > > 
> > > Is it an option to remove the define by default and only add it on Linux?
> > >
> > > I think this will also cause problems on other operating systems like
> > > Solaris, which also has the policy to restrict available symbols when
> > > a particular namespace is requested (in contrast to Linux, which adds
> > > symbols when a particular namespace is requested).
> 
> POSIX.1-2001 explicitly requires _POSIX_C_SOURCE macro to be defined.
> Not defining it may cause problems in other systems.

See above.

> To use these functions in linux we need one of following macros to be defined:
> _FILE_OFFSET_BITS == 64 || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
> 
> > Oh, another option would perhaps be to define _GNU_SOURCE which adds
> > symbols on Linux but is ignored everywhere else.
> 
> Not a good idea.
> 
> - _GNU_SOURCE would possibly change behavior for lots of
> POSIX-specified functions.
> 
> - We don't want to allow anything non-standard in the codebase.
> Adding _GNU_SOURCE would trigger endless loop of fixing non-standard
> extensions after every release.
> 
> Instead, we could add _NETBSD_SOURCE or _XOPEN_SOURCE ?
> That should fix the issue with NetBSD stdio.h.

I think defining _NETBSD_SOURCE is fine. Defining _XOPEN_SOURCE
usually introduces problems on Solaris (and sometimes NetBSD), since
that removes other symbols from the namespace there.

> While looking into this I noticed another possible problem with NetBSD:
> 
> Next libbluray release will use pread() from unistd.h. This function is
> an XSI extension in POSIX-1.2001, and mandatory in POSIX-1.2008.
> 
> from NetBSD unistd.h (I hope I used correct version ...):
> <<
> /*
>  * X/Open CAE Specification Issue 5 Version 2
>  */
> #if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
> ssize_t	 pread(int, void *, size_t, off_t);
> ssize_t	 pwrite(int, const void *, size_t, off_t);
> #endif
> >>
> 
> This is POSIX.1-2001 conforming (but not POSIX.1-2008 conforming)
> implementation of unistd.h

I've fixed this in the same commit.

> Maybe we should use _NETBSD_SOURCE or _XOPEN_SOURCE ?

As written above, I think _NETBSD_SOURCE is probably the better
solution (the headers will stay unfixed in NetBSD 5 and 6). If you go
with the _XOPEN_SOURCE definition, please test on Solaris.

Cheers,
 Thomas

> I think _XOPEN_SOURCE should fix both issues with NetBSD
> (and possibly with some other pre-POSIX.1-2008 systems).
> 
> from POSIX-1.2001:
> 
> <<
>   2.2.1.2 The _XOPEN_SOURCE Feature Test Macro
>   [XSI] An XSI-conforming application should ensure that the feature
>         test macro _XOPEN_SOURCE is defined with the value 600 before
>         inclusion of any header. This is needed to enable the
>         functionality described in Section 2.2.1.1 and in addition to
>         enable the XSI extension.
>         ...
> >>
> <<
>    XSI Extension
>        The functionality described is an XSI extension. Functionality
>        marked XSI is also an extension to the ISO C standard.
>        Application writers may confidently make use of an extension on
>        all systems supporting the X/Open System Interfaces Extension
> >>
> 
> 


More information about the libbdplus-devel mailing list