> FAIL: test-fbufmode
> FAIL: test-fclose
> FAIL: test-fflush
> FAIL: test-fflush2.sh
> FAIL: test-fpurge
> FAIL: test-freadable
> FAIL: test-freading
> FAIL: test-fwritable
> FAIL: test-posix_spawn-inherit0
> FAIL: test-supersede

These two patches fix the test failures on OpenBSD 7.8.

The first patch is a cleanup of unneeded changes from the previous
commit, taking into account
<https://github.com/openbsd/src/commit/24f9d669f84293935af75b1b5351b987dc03ad0b>.

The second patch adds support for OpenBSD 7.8 and drops support
for intermediate versions between OpenBSD 7.7 and 7.8.


2025-10-23  Bruno Haible  <[email protected]>

        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  <[email protected]>

        stdioext: Revert unneeded changes in 2025-07-20 commit.
        * lib/fpending.c (__fpending): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __fpending.
        * lib/freadahead.c (freadahead): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __freadahead.
        * lib/freading.c (freading): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __freading.
        * lib/freadptr.c (freadptr): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __freadptr.
        * lib/freadseek.c (freadptrinc): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __freadptrinc.
        * lib/fseterr.c (fseterr): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __fseterr.
        * lib/fwriting.c (fwriting): Don't test for __OpenBSD__, since
        OpenBSD >= 7.6 already has __fwriting.

>From 3813b2c439b64a6670b26332f660c53138c516ad Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Thu, 23 Oct 2025 16:06:22 +0200
Subject: [PATCH 1/2] stdioext: Revert unneeded changes in 2025-07-20 commit.

* lib/fpending.c (__fpending): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __fpending.
* lib/freadahead.c (freadahead): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __freadahead.
* lib/freading.c (freading): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __freading.
* lib/freadptr.c (freadptr): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __freadptr.
* lib/freadseek.c (freadptrinc): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __freadptrinc.
* lib/fseterr.c (fseterr): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __fseterr.
* lib/fwriting.c (fwriting): Don't test for __OpenBSD__, since
OpenBSD >= 7.6 already has __fwriting.
---
 ChangeLog        | 18 ++++++++++++++++++
 lib/fpending.c   |  8 ++++----
 lib/freadahead.c |  6 +++---
 lib/freading.c   |  8 ++++++--
 lib/freadptr.c   |  6 +++---
 lib/freadseek.c  |  6 +++---
 lib/fseterr.c    |  6 +++---
 lib/fwriting.c   |  8 ++++----
 8 files changed, 44 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a28b2c5225..b776dc087c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2025-10-23  Bruno Haible  <[email protected]>
+
+	stdioext: Revert unneeded changes in 2025-07-20 commit.
+	* lib/fpending.c (__fpending): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __fpending.
+	* lib/freadahead.c (freadahead): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __freadahead.
+	* lib/freading.c (freading): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __freading.
+	* lib/freadptr.c (freadptr): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __freadptr.
+	* lib/freadseek.c (freadptrinc): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __freadptrinc.
+	* lib/fseterr.c (fseterr): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __fseterr.
+	* lib/fwriting.c (fwriting): Don't test for __OpenBSD__, since
+	OpenBSD >= 7.6 already has __fwriting.
+
 2025-10-22  Collin Funk  <[email protected]>
 
 	doc: Update gmtime_r documentation for OpenBSD 7.8.
diff --git a/lib/fpending.c b/lib/fpending.c
index 5d85c64d89..5aaa33f58a 100644
--- a/lib/fpending.c
+++ b/lib/fpending.c
@@ -25,8 +25,8 @@
 #include "stdio-impl.h"
 
 /* This file is not used on systems that already have the __fpending function,
-   namely glibc >= 2.2, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34,
-   Android API >= 23, musl libc, Haiku >= hrev58760.  */
+   namely glibc >= 2.2, OpenBSD >= 7.6, Solaris >= 7, UnixWare >= 7.1.4.MP4,
+   Cygwin >= 1.7.34, Android API >= 23, musl libc, Haiku >= hrev58760.  */
 
 /* Return the number of pending (aka buffered, unflushed)
    bytes on the stream, FP, that is open for writing.  */
@@ -39,8 +39,8 @@ __fpending (FILE *fp)
 #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
   /* GNU libc, BeOS, Haiku, Linux libc5 */
   return fp->_IO_write_ptr - fp->_IO_write_base;
-#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+  /* FreeBSD, NetBSD, OpenBSD < 7.6, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return fp_->_p - fp_->_bf._base;
 #elif defined __EMX__                /* emx+gcc */
   return fp->_ptr - fp->_buffer;
diff --git a/lib/freadahead.c b/lib/freadahead.c
index b2c53d660f..da30c1cad8 100644
--- a/lib/freadahead.c
+++ b/lib/freadahead.c
@@ -28,7 +28,7 @@ extern size_t __sreadahead (FILE *);
 #endif
 
 /* This file is not used on systems that have the __freadahead function,
-   namely musl libc, Haiku >= hrev58760.  */
+   namely OpenBSD >= 7.6, musl libc, Haiku >= hrev58760.  */
 
 size_t
 freadahead (FILE *fp)
@@ -40,8 +40,8 @@ freadahead (FILE *fp)
   return (fp->_IO_read_end - fp->_IO_read_ptr)
          + (fp->_flags & _IO_IN_BACKUP ? fp->_IO_save_end - fp->_IO_save_base :
             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 < 7.6, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
     return 0;
 # if defined __DragonFly__
diff --git a/lib/freading.c b/lib/freading.c
index 8951475b81..059a5d48ae 100644
--- a/lib/freading.c
+++ b/lib/freading.c
@@ -25,6 +25,10 @@
    <https://sourceware.org/PR4359>  */
 #if !(HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)))
 
+/* This code is not compiled on systems that have a working __freading function,
+   namely glibc >= 2.7, OpenBSD >= 7.6, Solaris >= 7, UnixWare >= 7.1.4.MP4,
+   Cygwin >= 1.7.34, Android API >= 28, musl libc, Haiku >= hrev58760.  */
+
 bool
 freading (FILE *fp)
 {
@@ -36,8 +40,8 @@ freading (FILE *fp)
   return ((fp->_flags & _IO_NO_WRITES) != 0
           || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
               && fp->_IO_read_base != NULL));
-# elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
+# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+  /* FreeBSD, NetBSD, OpenBSD < 7.6, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return (fp_->_flags & __SRD) != 0;
 # elif defined __EMX__               /* emx+gcc */
   return (fp->_flags & _IOREAD) != 0;
diff --git a/lib/freadptr.c b/lib/freadptr.c
index 92c1fbcb47..d75205f8a4 100644
--- a/lib/freadptr.c
+++ b/lib/freadptr.c
@@ -24,7 +24,7 @@
 #include "stdio-impl.h"
 
 /* This file is not used on systems that have the __freadptr function,
-   namely musl libc, Haiku >= hrev58760.  */
+   namely OpenBSD >= 7.6, musl libc, Haiku >= hrev58760.  */
 
 const char *
 freadptr (FILE *fp, size_t *sizep)
@@ -41,8 +41,8 @@ freadptr (FILE *fp, size_t *sizep)
     return NULL;
   *sizep = size;
   return (const char *) fp->_IO_read_ptr;
-#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.6, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
     return NULL;
   size = fp_->_r;
diff --git a/lib/freadseek.c b/lib/freadseek.c
index 2ab790c1d8..18881e32ff 100644
--- a/lib/freadseek.c
+++ b/lib/freadseek.c
@@ -34,13 +34,13 @@ static void
 freadptrinc (FILE *fp, size_t increment)
 {
   /* Keep this code in sync with freadptr!  */
-#if HAVE___FREADPTRINC              /* musl libc, Haiku >= hrev58760 */
+#if HAVE___FREADPTRINC              /* OpenBSD >= 7.6, musl libc, Haiku >= hrev58760 */
   __freadptrinc (fp, increment);
 #elif defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
   /* GNU libc, BeOS, Haiku < hrev58760, Linux libc5 */
   fp->_IO_read_ptr += increment;
-#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.6, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   fp_->_p += increment;
   fp_->_r -= increment;
 #elif defined __EMX__               /* emx+gcc */
diff --git a/lib/fseterr.c b/lib/fseterr.c
index 4ac4d93204..40aca95c8e 100644
--- a/lib/fseterr.c
+++ b/lib/fseterr.c
@@ -24,7 +24,7 @@
 #include "stdio-impl.h"
 
 /* This file is not used on systems that have the __fseterr function,
-   namely musl libc, Haiku >= hrev58760.  */
+   namely OpenBSD >= 7.6, musl libc, Haiku >= hrev58760.  */
 
 void
 fseterr (FILE *fp)
@@ -35,8 +35,8 @@ fseterr (FILE *fp)
 #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
   /* GNU libc, BeOS, Haiku, Linux libc5 */
   fp->_flags |= _IO_ERR_SEEN;
-#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.6, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   fp_->_flags |= __SERR;
 #elif defined __EMX__               /* emx+gcc */
   fp->_flags |= _IOERR;
diff --git a/lib/fwriting.c b/lib/fwriting.c
index f9020b668b..3c7f4094e0 100644
--- a/lib/fwriting.c
+++ b/lib/fwriting.c
@@ -22,8 +22,8 @@
 #include "stdio-impl.h"
 
 /* This file is not used on systems that have the __fwriting function,
-   namely glibc >= 2.2, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34,
-   Android API >= 29, musl libc, Haiku >= hrev58760.  */
+   namely glibc >= 2.2, OpenBSD >= 7.6, Solaris >= 7, UnixWare >= 7.1.4.MP4,
+   Cygwin >= 1.7.34, Android API >= 28, musl libc, Haiku >= hrev58760.  */
 
 bool
 fwriting (FILE *fp)
@@ -34,8 +34,8 @@ fwriting (FILE *fp)
 #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
   /* GNU libc, BeOS, Haiku, Linux libc5 */
   return (fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) != 0;
-#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+  /* FreeBSD, NetBSD, OpenBSD < 7.6, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return (fp_->_flags & __SWR) != 0;
 #elif defined __EMX__               /* emx+gcc */
   return (fp->_flags & _IOWRT) != 0;
-- 
2.51.0

>From e1d738170920b51cb0035bf939dd29e4f7c6d6fb Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Thu, 23 Oct 2025 16:14:15 +0200
Subject: [PATCH 2/2] 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.
---
 ChangeLog        | 12 ++++++++++
 lib/fflush.c     | 16 ++++++-------
 lib/fpurge.c     | 10 ++++-----
 lib/fseeko.c     | 15 ++++++++-----
 lib/stdio-impl.h | 58 +++++++++++++++++++++++++++++++++++++++++-------
 5 files changed, 84 insertions(+), 27 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b776dc087c..a1228c2cd1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2025-10-23  Bruno Haible  <[email protected]>
+
+	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  <[email protected]>
 
 	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.
        <stdio.h> 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
+     <https://github.com/openbsd/src/commit/b7f6c2eb760a2da367dd51d539ef06f5f3553790>
+     the innards of FILE were public.  After this commit, the innards of FILE
+     are hidden.  In this commit
+     <https://github.com/openbsd/src/commit/9063a2f1ec94013fb0e2c7ec851495108e788a6e>
+     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 <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h>
      and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>.
-     After this commit, the innards of FILE are hidden.  Likewise for OpenBSD
-     up to this commit from 2025-07-16
-     <https://github.com/openbsd/src/commit/b7f6c2eb760a2da367dd51d539ef06f5f3553790>.  */
+     After this commit, the innards of FILE are hidden.  */
 #  define fp_ ((struct { unsigned char *_p; \
                          int _r; \
                          int _w; \
-- 
2.51.0

Reply via email to