]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
stdioext: Add support for OpenBSD >= 7.8.
authorBruno Haible <bruno@clisp.org>
Thu, 23 Oct 2025 14:14:15 +0000 (16:14 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 23 Oct 2025 14:14:15 +0000 (16:14 +0200)
* 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
lib/fflush.c
lib/fpurge.c
lib/fseeko.c
lib/stdio-impl.h

index b776dc087c42ba6daf5e8884897361e01ad60ff0..a1228c2cd1d0d71e1103489eb2651fd6f5f550ef 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2025-10-23  Bruno Haible  <bruno@clisp.org>
+
+       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  <bruno@clisp.org>
 
        stdioext: Revert unneeded changes in 2025-07-20 commit.
index 5f2ed1099de9271bcd87d3d52894ff20546d7e28..3aa9b42a2a0ce324227379e62519defdebef515c 100644 (file)
@@ -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
index 4e204880d04f1c8e00ff87c088f209a24bff5e93..53a3feaed35c3faeabdc2e8070cd8c9ca7f5176e 100644 (file)
@@ -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? */
index b72822cd2c6d85b55e4f2f915924722f1d664cd3..e48d42c5ef1883f3b75863792a58d9fe082e1f40 100644 (file)
@@ -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;
index 4abf9e68b23a78fe004b7154494b891e9920a598..e4a69a8d11bed4355dbab848a27eb48a68dca3f5 100644 (file)
 #  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 */
      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; \