Collin Funk <collin.fu...@gmail.com> writes:

>> Do you want to deal with it, or should I ?
>
> I'll take a look later today.

I pushed the attached patch which fixes it.

It is much simpler than I expected since most of the Android code can be
reused for OpenBSD. I know Bionic uses a lot of BSD stuff, but I assumed
the stdio implementation was different. I guess I was wrong.

I tested a testdir of all modules on an OpenBSD snapshot from 2025-07-19
and on OpenBSD 7.6 which does not have the change. Both passed all
tests.

Collin

>From 69a02b5307df043ca22c4b75eaec12be21493910 Mon Sep 17 00:00:00 2001
Message-ID: <69a02b5307df043ca22c4b75eaec12be21493910.1753071535.git.collin.fu...@gmail.com>
From: Collin Funk <collin.fu...@gmail.com>
Date: Sun, 20 Jul 2025 21:14:37 -0700
Subject: [PATCH] stdioext: Port to recent OpenBSD snapshots with an incomplete
 FILE type.

* lib/fbufmode.c (fbufmode): Check for __OpenBSD__ definition since
__sferror is no longer defined publicly on this platform.
* lib/fflush.c (clear_ungetc_buffer, update_fpos_cache, rpl_fflush):
Likewise.
* lib/fpending.c (__fpending): Likewise.
* lib/fpurge.c (fpurge): Likewise.
* lib/freadable.c (freadable): Likewise.
* lib/freadahead.c (freadahead): Likewise.
* lib/freading.c (freading): Likewise.
* lib/freadptr.c (freadptr): Likewise.
* lib/freadseek.c (freadptrinc): Likewise.
* lib/fseeko.c (fseeko): Likewise.
* lib/fseterr.c (fseterr): Likewise.
* lib/fwritable.c (fwritable): Likewise.
* lib/fwriting.c (fwriting): Likewise.
* lib/stdio-impl.h: Likewise.
(_gl_flags_file_t): Define to 'short'.
(_gl_file_offset_t): Define to 'fpos_t'.
(fp_): Define this macro using the one already written for Android.
(struct __sfileext): Define the same way as Android which does not rely
on a public 'struct __sbuf' definition.
(__SLBF, __SNBF, __SRD, __SWR, __SRW, __SEOF, __SERR, __SOFF): Define
macros to the same value as on Android.
---
 ChangeLog        | 27 +++++++++++++++++++++++++++
 lib/fbufmode.c   |  2 +-
 lib/fflush.c     |  8 ++++----
 lib/fpending.c   |  2 +-
 lib/fpurge.c     |  4 ++--
 lib/freadable.c  |  2 +-
 lib/freadahead.c |  2 +-
 lib/freading.c   |  2 +-
 lib/freadptr.c   |  2 +-
 lib/freadseek.c  |  2 +-
 lib/fseeko.c     |  6 +++---
 lib/fseterr.c    |  2 +-
 lib/fwritable.c  |  2 +-
 lib/fwriting.c   |  2 +-
 lib/stdio-impl.h | 29 +++++++++++++++++------------
 15 files changed, 63 insertions(+), 31 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a7dcba2070..9003983e2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2025-07-20  Collin Funk  <collin.fu...@gmail.com>
+
+	stdioext: Port to recent OpenBSD snapshots with an incomplete FILE type.
+	* lib/fbufmode.c (fbufmode): Check for __OpenBSD__ definition since
+	__sferror is no longer defined publicly on this platform.
+	* lib/fflush.c (clear_ungetc_buffer, update_fpos_cache, rpl_fflush):
+	Likewise.
+	* lib/fpending.c (__fpending): Likewise.
+	* lib/fpurge.c (fpurge): Likewise.
+	* lib/freadable.c (freadable): Likewise.
+	* lib/freadahead.c (freadahead): Likewise.
+	* lib/freading.c (freading): Likewise.
+	* lib/freadptr.c (freadptr): Likewise.
+	* lib/freadseek.c (freadptrinc): Likewise.
+	* lib/fseeko.c (fseeko): Likewise.
+	* lib/fseterr.c (fseterr): Likewise.
+	* lib/fwritable.c (fwritable): Likewise.
+	* lib/fwriting.c (fwriting): Likewise.
+	* lib/stdio-impl.h: Likewise.
+	(_gl_flags_file_t): Define to 'short'.
+	(_gl_file_offset_t): Define to 'fpos_t'.
+	(fp_): Define this macro using the one already written for Android.
+	(struct __sfileext): Define the same way as Android which does not rely
+	on a public 'struct __sbuf' definition.
+	(__SLBF, __SNBF, __SRD, __SWR, __SRW, __SEOF, __SERR, __SOFF): Define
+	macros to the same value as on Android.
+
 2025-07-20  Bruno Haible  <br...@clisp.org>
 
 	doc: Document resilience against supply chain attacks.
diff --git a/lib/fbufmode.c b/lib/fbufmode.c
index 416a7a4cd0..b10a122f94 100644
--- a/lib/fbufmode.c
+++ b/lib/fbufmode.c
@@ -48,7 +48,7 @@ fbufmode (FILE *fp)
   if (fp_->_flags & _IO_UNBUFFERED)
     return _IONBF;
   return _IOFBF;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if (fp_->_flags & __SLBF)
     return _IOLBF;
diff --git a/lib/fflush.c b/lib/fflush.c
index 9e256f3272..896b9dab3d 100644
--- a/lib/fflush.c
+++ b/lib/fflush.c
@@ -52,7 +52,7 @@ clear_ungetc_buffer_preserving_position (FILE *fp)
 static void
 clear_ungetc_buffer (FILE *fp)
 {
-# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if (HASUB (fp))
     {
@@ -77,7 +77,7 @@ 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 __DragonFly__ || defined __ANDROID__) && defined __SNPT
+# if (defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
 /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
 
 static int
@@ -100,7 +100,7 @@ static void
 update_fpos_cache (_GL_ATTRIBUTE_MAYBE_UNUSED FILE *fp,
                    _GL_ATTRIBUTE_MAYBE_UNUSED off_t pos)
 {
-#  if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#  if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
 #   if defined __CYGWIN__ || defined __ANDROID__
   /* fp_->_offset is typed as an integer.  */
@@ -205,7 +205,7 @@ rpl_fflush (FILE *stream)
         return result;
     }
 
-# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
+# if (defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
     /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
 
     {
diff --git a/lib/fpending.c b/lib/fpending.c
index be8a987734..529bc7f651 100644
--- a/lib/fpending.c
+++ b/lib/fpending.c
@@ -39,7 +39,7 @@ __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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return fp_->_p - fp_->_bf._base;
 #elif defined __EMX__                /* emx+gcc */
diff --git a/lib/fpurge.c b/lib/fpurge.c
index 0b0f90abda..a9f9c3d66f 100644
--- a/lib/fpurge.c
+++ b/lib/fpurge.c
@@ -45,7 +45,7 @@ fpurge (FILE *fp)
   extern int fpurge (FILE *);
 # endif
   int result = fpurge (fp);
-# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if (result == 0)
     /* Correct the invariants that fpurge broke.
@@ -75,7 +75,7 @@ fpurge (FILE *fp)
       fp->_IO_save_base = NULL;
     }
   return 0;
-# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+# elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   fp_->_p = fp_->_bf._base;
   fp_->_r = 0;
diff --git a/lib/freadable.c b/lib/freadable.c
index 2a494ae1ce..60eb32f93b 100644
--- a/lib/freadable.c
+++ b/lib/freadable.c
@@ -38,7 +38,7 @@ freadable (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) == 0;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return (fp_->_flags & (__SRW | __SRD)) != 0;
 #elif defined __EMX__               /* emx+gcc */
diff --git a/lib/freadahead.c b/lib/freadahead.c
index 5a7da7c30b..c44ab033c7 100644
--- a/lib/freadahead.c
+++ b/lib/freadahead.c
@@ -40,7 +40,7 @@ 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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
     return 0;
diff --git a/lib/freading.c b/lib/freading.c
index c8af68b5c5..1a5d0e0dad 100644
--- a/lib/freading.c
+++ b/lib/freading.c
@@ -36,7 +36,7 @@ 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 __DragonFly__ || defined __ANDROID__
+# elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return (fp_->_flags & __SRD) != 0;
 # elif defined __EMX__               /* emx+gcc */
diff --git a/lib/freadptr.c b/lib/freadptr.c
index bb56b47039..9719c177e5 100644
--- a/lib/freadptr.c
+++ b/lib/freadptr.c
@@ -41,7 +41,7 @@ freadptr (FILE *fp, size_t *sizep)
     return NULL;
   *sizep = size;
   return (const char *) fp->_IO_read_ptr;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
     return NULL;
diff --git a/lib/freadseek.c b/lib/freadseek.c
index 1fcc8d255a..5ddf7fab58 100644
--- a/lib/freadseek.c
+++ b/lib/freadseek.c
@@ -39,7 +39,7 @@ freadptrinc (FILE *fp, size_t 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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   fp_->_p += increment;
   fp_->_r -= increment;
diff --git a/lib/fseeko.c b/lib/fseeko.c
index b39099c4a0..d4b6d8f44c 100644
--- a/lib/fseeko.c
+++ b/lib/fseeko.c
@@ -55,7 +55,7 @@ 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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
 # if defined __SL64 && defined __SCLE /* Cygwin */
   if ((fp->_flags & __SL64) == 0)
@@ -120,7 +120,7 @@ fseeko (FILE *fp, off_t offset, int whence)
       off_t pos = lseek (fileno (fp), offset, whence);
       if (pos == -1)
         {
-#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
           /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
           fp_->_flags &= ~__SOFF;
 #endif
@@ -131,7 +131,7 @@ 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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
       /* FreeBSD, NetBSD, OpenBSD, 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.  */
diff --git a/lib/fseterr.c b/lib/fseterr.c
index f66f30460a..caa8ef1087 100644
--- a/lib/fseterr.c
+++ b/lib/fseterr.c
@@ -35,7 +35,7 @@ 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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
   fp_->_flags |= __SERR;
 #elif defined __EMX__               /* emx+gcc */
diff --git a/lib/fwritable.c b/lib/fwritable.c
index 1f29f7f773..54471a8271 100644
--- a/lib/fwritable.c
+++ b/lib/fwritable.c
@@ -38,7 +38,7 @@ fwritable (FILE *fp)
 #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
   /* GNU libc, BeOS, Haiku, Linux libc5 */
   return (fp->_flags & _IO_NO_WRITES) == 0;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return (fp_->_flags & (__SRW | __SWR)) != 0;
 #elif defined __EMX__               /* emx+gcc */
diff --git a/lib/fwriting.c b/lib/fwriting.c
index 3308ffcc3c..90cb2c3ad5 100644
--- a/lib/fwriting.c
+++ b/lib/fwriting.c
@@ -34,7 +34,7 @@ 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 __DragonFly__ || defined __ANDROID__
+#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return (fp_->_flags & __SWR) != 0;
 #elif defined __EMX__               /* emx+gcc */
diff --git a/lib/stdio-impl.h b/lib/stdio-impl.h
index 4b4263fe90..36295b9477 100644
--- a/lib/stdio-impl.h
+++ b/lib/stdio-impl.h
@@ -82,7 +82,7 @@
 
 #include <errno.h>                             /* For detecting Plan9.  */
 
-#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+#if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__
   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
 
 # if defined __DragonFly__          /* DragonFly */
@@ -108,13 +108,15 @@
 #  define _flags pub._flags
 #  define _r pub._r
 #  define _w pub._w
-# elif defined __ANDROID__ /* Android */
-#  ifdef __LP64__
+# elif defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */
+#  if defined __LP64__ && !defined __OpenBSD__
 #   define _gl_flags_file_t int
 #  else
 #   define _gl_flags_file_t short
 #  endif
-#  ifdef __LP64__
+#  if defined __OpenBSD__
+#   define _gl_file_offset_t fpos_t
+#  elif defined __LP64__
 #   define _gl_file_offset_t int64_t
 #  else
     /* see https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */
@@ -122,10 +124,12 @@
 #  endif
   /* Up to this commit from 2015-10-12
      <https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a>
-     the innards of FILE were public, and fp_ub could be defined like for OpenBSD,
+     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.  */
+     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>.  */
 #  define fp_ ((struct { unsigned char *_p; \
                          int _r; \
                          int _w; \
@@ -152,9 +156,8 @@
 #  define fp_ fp
 # endif
 
-# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */
+# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __minix /* NetBSD >= 1.5ZA, Minix 3 */
   /* See <https://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
-     and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
      and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */
   struct __sfileext
     {
@@ -162,7 +165,7 @@
       /* More fields, not relevant here.  */
     };
 #  define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
-# elif defined __ANDROID__                     /* Android */
+# elif defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */
   struct __sfileext
     {
       struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */
@@ -175,9 +178,11 @@
 
 # define HASUB(fp) (fp_ub._base != NULL)
 
-# if defined __ANDROID__ /* Android */
-  /* Needed after this commit from 2016-01-25
-     <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */
+# if defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */
+  /* Needed after this Android commit from 2016-01-25
+     <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7>
+     And after this OpenBSD commit from 2025-07-16
+     <https://github.com/openbsd/src/commit/b7f6c2eb760a2da367dd51d539ef06f5f3553790>.  */
 #  ifndef __SEOF
 #   define __SLBF 1
 #   define __SNBF 2
-- 
2.50.1

Reply via email to