From: Bruno Haible Date: Thu, 23 Oct 2025 14:14:15 +0000 (+0200) Subject: stdioext: Add support for OpenBSD >= 7.8. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1d738170920b51cb0035bf939dd29e4f7c6d6fb;p=thirdparty%2Fgnulib.git stdioext: Add support for OpenBSD >= 7.8. * lib/stdio-impl.h (fp_): Separate definitions for OpenBSD from those for Android. Add definition for OpenBSD >= 7.8. * lib/fflush.c (clear_ungetc_buffer, disable_seek_optimization, update_fpos_cache, rpl_fflush): Don't test for __OpenBSD__, since OpenBSD <= 7.7 is covered by the __sferror test and OpenBSD >= 7.8 does not need the workarounds. * lib/fseeko.c (fseeko): Likewise. * lib/fpurge.c (fpurge): Likewise. --- diff --git a/ChangeLog b/ChangeLog index b776dc087c..a1228c2cd1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2025-10-23 Bruno Haible + + stdioext: Add support for OpenBSD >= 7.8. + * lib/stdio-impl.h (fp_): Separate definitions for OpenBSD from those + for Android. Add definition for OpenBSD >= 7.8. + * lib/fflush.c (clear_ungetc_buffer, disable_seek_optimization, + update_fpos_cache, rpl_fflush): Don't test for __OpenBSD__, since + OpenBSD <= 7.7 is covered by the __sferror test and OpenBSD >= 7.8 does + not need the workarounds. + * lib/fseeko.c (fseeko): Likewise. + * lib/fpurge.c (fpurge): Likewise. + 2025-10-23 Bruno Haible stdioext: Revert unneeded changes in 2025-07-20 commit. diff --git a/lib/fflush.c b/lib/fflush.c index 5f2ed1099d..3aa9b42a2a 100644 --- a/lib/fflush.c +++ b/lib/fflush.c @@ -52,8 +52,8 @@ clear_ungetc_buffer_preserving_position (FILE *fp) static void clear_ungetc_buffer (FILE *fp) { -# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +# if defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if (HASUB (fp)) { fp_->_p += fp_->_r; @@ -77,8 +77,8 @@ clear_ungetc_buffer (FILE *fp) #if ! (defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1) /* GNU libc, BeOS, Haiku, Linux libc5 */ -# if (defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT -/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT +/* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ static int disable_seek_optimization (FILE *fp) @@ -100,8 +100,8 @@ static void update_fpos_cache (_GL_ATTRIBUTE_MAYBE_UNUSED FILE *fp, _GL_ATTRIBUTE_MAYBE_UNUSED off_t pos) { -# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +# if defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __CYGWIN__ || defined __ANDROID__ /* fp_->_offset is typed as an integer. */ fp_->_offset = pos; @@ -205,8 +205,8 @@ rpl_fflush (FILE *stream) return result; } -# if (defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ { /* Disable seek optimization for the next fseeko call. This tells the diff --git a/lib/fpurge.c b/lib/fpurge.c index 4e204880d0..53a3feaed3 100644 --- a/lib/fpurge.c +++ b/lib/fpurge.c @@ -37,7 +37,7 @@ fpurge (FILE *fp) /* The __fpurge function does not have a return value. */ return 0; -#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin >= 1.7 */ +#elif HAVE_FPURGE /* FreeBSD, NetBSD, 2.0 <= OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin >= 1.7 */ /* Call the system's fpurge function. */ # undef fpurge @@ -45,8 +45,8 @@ fpurge (FILE *fp) extern int fpurge (FILE *); # endif int result = fpurge (fp); -# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +# if defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if (result == 0) /* Correct the invariants that fpurge broke. on BSD systems says: @@ -75,8 +75,8 @@ fpurge (FILE *fp) fp->_IO_save_base = NULL; } return 0; -# elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD < 2.0, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_p = fp_->_bf._base; fp_->_r = 0; fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */ diff --git a/lib/fseeko.c b/lib/fseeko.c index b72822cd2c..e48d42c5ef 100644 --- a/lib/fseeko.c +++ b/lib/fseeko.c @@ -55,8 +55,8 @@ fseeko (FILE *fp, off_t offset, int whence) if (fp_->_IO_read_end == fp_->_IO_read_ptr && fp_->_IO_write_ptr == fp_->_IO_write_base && fp_->_IO_save_base == NULL) -#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __SL64 && defined __SCLE /* Cygwin */ if ((fp->_flags & __SL64) == 0) { @@ -104,6 +104,9 @@ fseeko (FILE *fp, off_t offset, int whence) #elif defined EPLAN9 /* Plan9 */ if (fp->rp == fp->buf && fp->wp == fp->buf) +#elif defined __OpenBSD__ && !defined __sferror /* OpenBSD >= 7.8 */ + /* fseeko and fflush work as advertised. */ + if (0) #elif FUNC_FFLUSH_STDIN < 0 && 200809 <= _POSIX_VERSION /* Cross-compiling to some other system advertising conformance to POSIX.1-2008 or later. Assume fseeko and fflush work as advertised. @@ -120,8 +123,8 @@ fseeko (FILE *fp, off_t offset, int whence) off_t pos = lseek (fileno (fp), offset, whence); if (pos == -1) { -#if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +#if defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_flags &= ~__SOFF; #endif return -1; @@ -131,8 +134,8 @@ fseeko (FILE *fp, off_t offset, int whence) /* GNU libc, BeOS, Haiku, Linux libc5 */ fp_->_flags &= ~_IO_EOF_SEEN; fp_->_offset = pos; -#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ - /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ +#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ + /* FreeBSD, NetBSD, OpenBSD <= 7.7, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __CYGWIN__ || (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || defined __minix /* fp_->_offset is typed as an integer. */ fp_->_offset = pos; diff --git a/lib/stdio-impl.h b/lib/stdio-impl.h index 4abf9e68b2..e4a69a8d11 100644 --- a/lib/stdio-impl.h +++ b/lib/stdio-impl.h @@ -108,15 +108,59 @@ # define _flags pub._flags # define _r pub._r # define _w pub._w -# elif defined __ANDROID__ || defined __OpenBSD__ /* Android, OpenBSD */ -# if defined __LP64__ && !defined __OpenBSD__ +# elif defined __OpenBSD__ /* OpenBSD */ +# if defined __sferror /* OpenBSD <= 7.7 */ +# define _gl_flags_file_t short +# else /* OpenBSD >= 7.8 */ +# define _gl_flags_file_t int +# endif + /* Up to this commit from 2025-07-16 + + the innards of FILE were public. After this commit, the innards of FILE + are hidden. In this commit + + they were reshuffled. */ +# if defined __sferror /* OpenBSD <= 7.7 */ +# define fp_ ((struct { unsigned char *_p; \ + int _r; \ + int _w; \ + _gl_flags_file_t _flags; \ + _gl_flags_file_t _file; \ + struct { unsigned char *_base; size_t _size; } _bf; \ + int _lbfsize; \ + void *_cookie; \ + void *_close; \ + void *_read; \ + void *_seek; \ + void *_write; \ + struct { unsigned char *_base; size_t _size; } _ext; \ + unsigned char *_up; \ + int _ur; \ + unsigned char _ubuf[3]; \ + unsigned char _nbuf[1]; \ + struct { unsigned char *_base; size_t _size; } _lb; \ + int _blksize; \ + fpos_t _offset; \ + /* More fields, not relevant here. */ \ + } *) fp) +# else /* OpenBSD >= 7.8 */ +# define fp_ ((struct { _gl_flags_file_t _flags; \ + _gl_flags_file_t _file; \ + unsigned char *_p; \ + int _r; \ + int _w; \ + struct { unsigned char *_base; size_t _size; } _bf; \ + int _lbfsize; \ + /* More fields, not relevant here. */ \ + } *) fp) +# endif +# elif defined __ANDROID__ /* Android */ +# if defined __LP64__ # define _gl_flags_file_t int # else # define _gl_flags_file_t short # endif -# if defined __OpenBSD__ -# define _gl_file_offset_t fpos_t -# elif defined __LP64__ +# if defined __LP64__ # define _gl_file_offset_t int64_t # else /* see https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */ @@ -127,9 +171,7 @@ the innards of FILE were public, see and . - After this commit, the innards of FILE are hidden. Likewise for OpenBSD - up to this commit from 2025-07-16 - . */ + After this commit, the innards of FILE are hidden. */ # define fp_ ((struct { unsigned char *_p; \ int _r; \ int _w; \