From: Collin Funk Date: Mon, 21 Jul 2025 04:14:37 +0000 (-0700) Subject: stdioext: Port to recent OpenBSD snapshots with an incomplete FILE type. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69a02b5307df043ca22c4b75eaec12be21493910;p=thirdparty%2Fgnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index a7dcba2070..9003983e2c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +2025-07-20 Collin Funk + + 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 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 /* 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 - the innards of FILE were public, and fp_ub could be defined like for OpenBSD, + the innards of FILE were public, see and . - 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 + . */ # 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 - and and */ 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 - */ +# if defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */ + /* Needed after this Android commit from 2016-01-25 + + And after this OpenBSD commit from 2025-07-16 + . */ # ifndef __SEOF # define __SLBF 1 # define __SNBF 2