This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2 3/5] Don't install libio.h or _G_config.h.
On 05/02/2018 21:34, Zack Weinberg wrote:
> In this patch, we stop installing libio.h and _G_config.h for public
> use; necessarily, this means the public stdio.h stops including
> libio.h.
>
> The public stdio.h had a genuine dependency on libio.h for the
> complete definitions of FILE and cookie_io_functions_t, and a genuine
> dependency on _G_config.h for the complete definitions of fpos_t and
> fpos64_t; these are moved to single-type headers.
> bits/types/struct_FILE.h also provides a handful of accessor and
> bitflags macros so that code is not duplicated between bits/stdio.h
> and libio.h. All the other _IO_ and _G_ names used by the public
> stdio.h are replaced with either public names or __-names.
>
> In order to minimize the risk of breaking our own compatibility code,
> bits/types/struct_FILE.h preserves the _IO_USE_OLD_IO_FILE mechanism
> exactly as it was in libio.h, but you have to define _LIBC to use it,
> or it'll error out. Similarly, _IO_lock_t_defined is preserved
> exactly, but will error out if used without defining _LIBC.
>
> Internally, include/stdio.h continues to include libio.h, and libio.h
> scrupulously provides every _IO_* and _G_* name that it always did,
> perhaps now defined in terms of the public names. This is how this
> patch avoids touching dozens of files throughout glibc and becoming
> entangled with the _IO_MTSAFE_IO mess. The remaining patches in this
> series eliminate most of the _G_ names.
>
> Installed stripped libraries are unchanged by this patch.
It looks good to me, with just a couple of nits below (which do not block the
patch itself). Bootstrap build with build-many-glibc.py for x86_64-linux-gnu
at least is clean (although I do not think it uses any libio functionality).
>
> * libio/bits/types/__fpos_t.h, libio/bits/types/__fpos64_t.h:
> New single-type headers split from _G_config.h.
> * libio/bits/types/cookie_io_functions_t.h
> * libio/bits/types/struct_FILE.h
> New single-type headers split from libio.h.
>
> * libio/Makefile: Install the above new headers. Don't install
> libio.h, _G_config.h, bits/libio.h, bits/_G_config.h, or
> bits/libio-ldbl.h.
> * libio/_G_config.h, libio/libio.h: Delete file.
>
> * libio/bits/libio.h: Remove improper-inclusion guard.
> Include stdio.h and don't repeat anything that it does.
> Define _IO_fpos_t as __fpos_t, _IO_fpos64_t as __fpos64_t,
> _IO_BUFSIZ as BUFSIZ, _IO_va_list as __gnuc_va_list,
> __io_read_fn as cookie_read_function_t,
> __io_write_fn as cookie_write_function_t,
> __io_seek_fn as cookie_seek_function_t,
> __io_close_fn as cookie_close_function_t,
> and _IO_cookie_io_functions_t as cookie_io_functions_t.
> Define _STDIO_USES_IOSTREAM, __HAVE_COLUMN, and _IO_file_flags
> here, in the "compatibility defines" section. Remove an #if 0
> block. Use the "body" macros from bits/types/struct_FILE.h to
> define _IO_getc_unlocked, _IO_putc_unlocked, _IO_feof_unlocked,
> and _IO_ferror_unlocked.
> Move prototypes of __uflow and __overflow...
>
> * libio/stdio.h: ...here. Don't include bits/libio.h.
> Don't define _STDIO_USES_IOSTREAM. Get __gnuc_va_list
> directly from stdarg.h. Include bits/types/__fpos_t.h,
> bits/types/__fpos64_t.h, bits/types/struct_FILE.h,
> and, when __USE_GNU, bits/types/cookie_io_functions_t.h.
> Use __gnuc_va_list, not _G_va_list; __fpos_t, not _G_fpos_t;
> __fpos64_t, not _G_fpos64_t; FILE, not struct _IO_FILE;
> cookie_io_functions_t, not _IO_cookie_io_functions_t;
> __ssize_t, not _IO_ssize_t. Unconditionally define
> BUFSIZ as 8192 and EOF as (-1).
>
> * libio/bits/stdio.h: Add multiple-include guard. Use the "body"
> macros from bits/types/struct_FILE.h instead of _IO_* macros
> from libio.h; use __gnuc_va_list instead of va_list and __ssize_t
> instead of _IO_ssize_t.
> * libio/bits/stdio2.h: Similarly.
>
> * libio/iolibio.h: Add multiple-include guard.
> Include bits/libio.h after stdio.h.
> * libio/libioP.h: Add multiple-include guard.
> Include stdio.h and bits/libio.h before iolibio.h.
>
> * include/bits/types/__fpos_t.h, include/bits/types/__fpos64_t.h
> * include/bits/types/cookie_io_functions_t.h
> * include/bits/types/struct_FILE.h: New wrappers.
>
> * bits/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h:
> Get definitions of _G_fpos_t and _G_fpos64_t from
> bits/types/__fpos_t.h and bits/types/__fpos64_t.h
> respectively. Remove improper-inclusion guards.
>
> * conform/data/stdio.h-data: Update expectations of va_list.
> * scripts/check-installed-headers.sh: Remove special case for
> libio.h and _G_config.h.
> ---
> NEWS | 4 +-
> bits/_G_config.h | 20 +--
> conform/data/stdio.h-data | 2 +-
> include/bits/types/__fpos64_t.h | 1 +
> include/bits/types/__fpos_t.h | 1 +
> include/bits/types/cookie_io_functions_t.h | 1 +
> include/bits/types/struct_FILE.h | 1 +
> include/stdio.h | 5 +
> libio/Makefile | 9 +-
> libio/_G_config.h | 25 ----
> libio/bits/libio.h | 194 ++++-------------------------
> libio/bits/stdio.h | 29 +++--
> libio/bits/stdio2.h | 35 +++---
> libio/bits/types/__fpos64_t.h | 16 +++
> libio/bits/types/__fpos_t.h | 16 +++
> libio/bits/types/cookie_io_functions_t.h | 46 +++++++
> libio/bits/types/struct_FILE.h | 120 ++++++++++++++++++
> libio/iolibio.h | 6 +
> libio/libio.h | 25 ----
> libio/libioP.h | 7 ++
> libio/stdio.h | 95 +++++++-------
> scripts/check-installed-headers.sh | 5 -
> sysdeps/unix/sysv/linux/bits/_G_config.h | 20 +--
> 23 files changed, 350 insertions(+), 333 deletions(-)
> create mode 100644 include/bits/types/__fpos64_t.h
> create mode 100644 include/bits/types/__fpos_t.h
> create mode 100644 include/bits/types/cookie_io_functions_t.h
> create mode 100644 include/bits/types/struct_FILE.h
> delete mode 100644 libio/_G_config.h
> create mode 100644 libio/bits/types/__fpos64_t.h
> create mode 100644 libio/bits/types/__fpos_t.h
> create mode 100644 libio/bits/types/cookie_io_functions_t.h
> create mode 100644 libio/bits/types/struct_FILE.h
> delete mode 100644 libio/libio.h
>
> diff --git a/NEWS b/NEWS
> index eceab2b2be2..87a3f1d1cd8 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -13,7 +13,9 @@ Major new features:
>
> Deprecated and removed features, and other changes affecting compatibility:
>
> - [Add deprecations, removals and changes affecting compatibility here]
> + * The nonstandard header files <libio.h> and <_G_config.h> are no longer
> + installed. Software that was using either header should be updated to
> + use standard <stdio.h> interfaces instead.
>
> * The stdio.h functions 'getc' and 'putc' are no longer defined as macros.
> This was never required by the C standard, and the macros just expanded
> diff --git a/bits/_G_config.h b/bits/_G_config.h
> index 2b60d29f5ff..8c81bc42787 100644
> --- a/bits/_G_config.h
> +++ b/bits/_G_config.h
> @@ -4,10 +4,6 @@
> #ifndef _BITS_G_CONFIG_H
> #define _BITS_G_CONFIG_H 1
>
> -#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H
> -# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead."
> -#endif
> -
Ok.
> /* Define types for libio in terms of the standard internal type names. */
>
> #include <bits/types.h>
> @@ -19,20 +15,16 @@
> #include <stddef.h>
>
> #include <bits/types/__mbstate_t.h>
> +#include <bits/types/__fpos_t.h>
> +#include <bits/types/__fpos64_t.h>
> +
> +#define _G_fpos_t __fpos_t
> +#define _G_fpos64_t __fpos64_t
> +
> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> # include <bits/types/wint_t.h>
> #endif
>
> -typedef struct
> -{
> - __off_t __pos;
> - __mbstate_t __state;
> -} _G_fpos_t;
> -typedef struct
> -{
> - __off64_t __pos;
> - __mbstate_t __state;
> -} _G_fpos64_t;
> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> # include <gconv.h>
> typedef union
> diff --git a/conform/data/stdio.h-data b/conform/data/stdio.h-data
> index f69802cc703..3ef24606610 100644
> --- a/conform/data/stdio.h-data
> +++ b/conform/data/stdio.h-data
> @@ -41,7 +41,7 @@ type fpos_t
> #if !defined ISO && !defined ISO99 && !defined ISO11 && !defined POSIX
> type va_list
> #else
> -#define va_list _G_va_list
> +#define va_list
> #endif
> type size_t
> #if defined XOPEN2K8 || defined POSIX2008
> diff --git a/include/bits/types/__fpos64_t.h b/include/bits/types/__fpos64_t.h
> new file mode 100644
> index 00000000000..68cc4e8b66c
> --- /dev/null
> +++ b/include/bits/types/__fpos64_t.h
> @@ -0,0 +1 @@
> +#include <libio/bits/types/__fpos64_t.h>
> diff --git a/include/bits/types/__fpos_t.h b/include/bits/types/__fpos_t.h
> new file mode 100644
> index 00000000000..2dcdc98d750
> --- /dev/null
> +++ b/include/bits/types/__fpos_t.h
> @@ -0,0 +1 @@
> +#include <libio/bits/types/__fpos_t.h>
> diff --git a/include/bits/types/cookie_io_functions_t.h b/include/bits/types/cookie_io_functions_t.h
> new file mode 100644
> index 00000000000..87f7930c6ec
> --- /dev/null
> +++ b/include/bits/types/cookie_io_functions_t.h
> @@ -0,0 +1 @@
> +#include <libio/bits/types/cookie_io_functions_t.h>
> diff --git a/include/bits/types/struct_FILE.h b/include/bits/types/struct_FILE.h
> new file mode 100644
> index 00000000000..971407292be
> --- /dev/null
> +++ b/include/bits/types/struct_FILE.h
> @@ -0,0 +1 @@
> +#include <libio/bits/types/struct_FILE.h>
> diff --git a/include/stdio.h b/include/stdio.h
> index f1e987ae5e3..3b6da17d82f 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -1,6 +1,11 @@
> #ifndef _STDIO_H
> +# if !defined _ISOMAC && defined _IO_MTSAFE_IO
> +# include <stdio-lock.h>
> +# endif
> # include <libio/stdio.h>
> # ifndef _ISOMAC
> +# define _LIBC_STDIO_H 1
> +# include <bits/libio.h>
>
> /* Now define the internal interfaces. */
>
> diff --git a/libio/Makefile b/libio/Makefile
> index 918a86bb743..3e08ed0eeb0 100644
> --- a/libio/Makefile
> +++ b/libio/Makefile
> @@ -22,10 +22,11 @@ subdir := libio
>
> include ../Makeconfig
>
> -headers := stdio.h libio.h _G_config.h \
> - bits/stdio.h bits/libio.h bits/_G_config.h \
> - bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \
> - bits/types/FILE.h bits/types/__FILE.h
> +headers := stdio.h \
> + bits/stdio.h bits/stdio2.h bits/sys_errlist.h bits/stdio-ldbl.h \
> + bits/types/FILE.h bits/types/__FILE.h bits/types/struct_FILE.h \
> + bits/types/__fpos_t.h bits/types/__fpos64_t.h \
> + bits/types/cookie_io_functions_t.h
Ok.
>
> routines := \
> filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \
> diff --git a/libio/_G_config.h b/libio/_G_config.h
> deleted file mode 100644
> index 68de2fcaa0d..00000000000
> --- a/libio/_G_config.h
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/* Copyright (C) 2017-2018 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#ifndef _G_CONFIG_H
> -#define _G_CONFIG_H 1
> -
> -#warning "<_G_config.h> is deprecated; use <stdio.h> instead."
> -
> -#include <bits/_G_config.h>
> -
> -#endif
Ok.
> diff --git a/libio/bits/libio.h b/libio/bits/libio.h
> index fae5b932a1f..cefc2c855b9 100644
> --- a/libio/bits/libio.h
> +++ b/libio/bits/libio.h
> @@ -28,14 +28,12 @@
> #ifndef _BITS_LIBIO_H
> #define _BITS_LIBIO_H 1
>
> -#if !defined _STDIO_H && !defined _LIBIO_H
> -# error "Never include <bits/libio.h> directly; use <stdio.h> instead."
> -#endif
> +#include <stdio.h>
Ok.
>
> #include <bits/_G_config.h>
> /* ALL of these should be defined in _G_config.h */
> -#define _IO_fpos_t _G_fpos_t
> -#define _IO_fpos64_t _G_fpos64_t
> +#define _IO_fpos_t __fpos_t
> +#define _IO_fpos64_t __fpos64_t
> #define _IO_size_t size_t
> #define _IO_ssize_t __ssize_t
> #define _IO_off_t __off_t
> @@ -44,40 +42,17 @@
> #define _IO_uid_t __uid_t
> #define _IO_iconv_t _G_iconv_t
> #define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE
> -#define _IO_BUFSIZ _G_BUFSIZ
> -#define _IO_va_list _G_va_list
> +#define _IO_BUFSIZ BUFSIZ
> #define _IO_wint_t wint_t
> +#define _IO_va_list __gnuc_va_list
>
> -/* This define avoids name pollution if we're using GNU stdarg.h */
> -#define __need___va_list
> -#include <stdarg.h>
> -#ifdef __GNUC_VA_LIST
> -# undef _IO_va_list
> -# define _IO_va_list __gnuc_va_list
> -#endif /* __GNUC_VA_LIST */
> -
> -#ifndef __P
> -# include <sys/cdefs.h>
> -#endif /*!__P*/
> -
> +/* compatibility defines */
> +#define _STDIO_USES_IOSTREAM
> #define _IO_UNIFIED_JUMPTABLES 1
> +#define __HAVE_COLUMN
> +#define _IO_file_flags _flags
>
> -#ifndef EOF
> -# define EOF (-1)
> -#endif
> -#ifndef NULL
> -# if defined __GNUG__ && \
> - (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
> -# define NULL (__null)
> -# else
> -# if !defined(__cplusplus)
> -# define NULL ((void*)0)
> -# else
> -# define NULL (0)
> -# endif
> -# endif
> -#endif
> -
> +/* open modes */
> #define _IOS_INPUT 1
> #define _IOS_OUTPUT 2
> #define _IOS_ATEND 4
> @@ -146,14 +121,7 @@
> #define _IO_BOOLALPHA 0200000
>
>
> -struct _IO_jump_t; struct _IO_FILE;
> -
> -/* During the build of glibc itself, _IO_lock_t will already have been
> - defined by internal headers. */
> -#ifndef _IO_lock_t_defined
> -typedef void _IO_lock_t;
> -#endif
> -
> +struct _IO_jump_t;
>
> /* A streammarker remembers a position in a buffer. */
>
> @@ -164,16 +132,6 @@ struct _IO_marker {
> it points to _buf->Gbase()+_pos. FIXME comment */
> /* if _pos < 0, it points to _buf->eBptr()+_pos. FIXME comment */
> int _pos;
> -#if 0
> - void set_streampos(streampos sp) { _spos = sp; }
> - void set_offset(int offset) { _pos = offset; _spos = (streampos)(-2); }
> - public:
> - streammarker(streambuf *sb);
> - ~streammarker();
> - int saving() { return _spos == -2; }
> - int delta(streammarker&);
> - int delta();
> -#endif
> };
Ok.
>
> /* This is the structure from the libstdc++ codecvt class. */
> @@ -242,73 +200,6 @@ struct _IO_wide_data
> };
> #endif
>
> -struct _IO_FILE {
> - int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
> -#define _IO_file_flags _flags
> -
> - /* The following pointers correspond to the C++ streambuf protocol. */
> - /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
> - char* _IO_read_ptr; /* Current read pointer */
> - char* _IO_read_end; /* End of get area. */
> - char* _IO_read_base; /* Start of putback+get area. */
> - char* _IO_write_base; /* Start of put area. */
> - char* _IO_write_ptr; /* Current put pointer. */
> - char* _IO_write_end; /* End of put area. */
> - char* _IO_buf_base; /* Start of reserve area. */
> - char* _IO_buf_end; /* End of reserve area. */
> - /* The following fields are used to support backing up and undo. */
> - char *_IO_save_base; /* Pointer to start of non-current get area. */
> - char *_IO_backup_base; /* Pointer to first valid character of backup area */
> - char *_IO_save_end; /* Pointer to end of non-current get area. */
> -
> - struct _IO_marker *_markers;
> -
> - struct _IO_FILE *_chain;
> -
> - int _fileno;
> -#if 0
> - int _blksize;
> -#else
> - int _flags2;
> -#endif
> - _IO_off_t _old_offset; /* This used to be _offset but it's too small. */
> -
> -#define __HAVE_COLUMN /* temporary */
> - /* 1+column number of pbase(); 0 is unknown. */
> - unsigned short _cur_column;
> - signed char _vtable_offset;
> - char _shortbuf[1];
> -
> - /* char* _save_gptr; char* _save_egptr; */
> -
> - _IO_lock_t *_lock;
> -#ifdef _IO_USE_OLD_IO_FILE
> -};
> -
> -struct _IO_FILE_complete
> -{
> - struct _IO_FILE _file;
> -#endif
> -#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001
> - _IO_off64_t _offset;
> -# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> - /* Wide character stream stuff. */
> - struct _IO_codecvt *_codecvt;
> - struct _IO_wide_data *_wide_data;
> - struct _IO_FILE *_freeres_list;
> - void *_freeres_buf;
> -# else
> - void *__pad1;
> - void *__pad2;
> - void *__pad3;
> - void *__pad4;
> -# endif
> - size_t __pad5;
> - int _mode;
> - /* Make sure we don't get into trouble again. */
> - char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
> -#endif
> -};
Ok.
>
> #ifndef __cplusplus
> typedef struct _IO_FILE _IO_FILE;
> @@ -330,49 +221,13 @@ extern _IO_FILE *_IO_stderr attribute_hidden;
> #endif
>
>
> -/* Functions to do I/O and file management for a stream. */
> -
> -/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF.
> - Return number of bytes read. */
> -typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
> -
> -/* Write N bytes pointed to by BUF to COOKIE. Write all N bytes
> - unless there is an error. Return number of bytes written. If
> - there is an error, return 0 and do not write anything. If the file
> - has been opened for append (__mode.__append set), then set the file
> - pointer to the end of the file and then do the write; if not, just
> - write at the current file pointer. */
> -typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf,
> - size_t __n);
> -
> -/* Move COOKIE's file position to *POS bytes from the
> - beginning of the file (if W is SEEK_SET),
> - the current position (if W is SEEK_CUR),
> - or the end of the file (if W is SEEK_END).
> - Set *POS to the new file position.
> - Returns zero if successful, nonzero if not. */
> -typedef int __io_seek_fn (void *__cookie, _IO_off64_t *__pos, int __w);
> -
> -/* Close COOKIE. */
> -typedef int __io_close_fn (void *__cookie);
> -
> -
> +/* Compatibility names for cookie I/O functions. */
> #ifdef __USE_GNU
> -/* User-visible names for the above. */
> -typedef __io_read_fn cookie_read_function_t;
> -typedef __io_write_fn cookie_write_function_t;
> -typedef __io_seek_fn cookie_seek_function_t;
> -typedef __io_close_fn cookie_close_function_t;
> -
> -/* The structure with the cookie function pointers. */
> -typedef struct
> -{
> - __io_read_fn *read; /* Read bytes. */
> - __io_write_fn *write; /* Write bytes. */
> - __io_seek_fn *seek; /* Seek/tell file position. */
> - __io_close_fn *close; /* Close file. */
> -} _IO_cookie_io_functions_t;
> -typedef _IO_cookie_io_functions_t cookie_io_functions_t;
Ok.
> +typedef cookie_read_function_t __io_read_fn;
> +typedef cookie_write_function_t __io_write_fn;
> +typedef cookie_seek_function_t __io_seek_fn;
> +typedef cookie_close_function_t __io_close_fn;
> +typedef cookie_io_functions_t _IO_cookie_io_functions_t;
Ok.
>
> struct _IO_cookie_file;
>
> @@ -387,8 +242,6 @@ extern "C" {
> #endif
>
> extern int __underflow (_IO_FILE *);
> -extern int __uflow (_IO_FILE *);
> -extern int __overflow (_IO_FILE *, int);
> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> extern _IO_wint_t __wunderflow (_IO_FILE *);
> extern _IO_wint_t __wuflow (_IO_FILE *);
> @@ -401,17 +254,12 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
> # define _IO_BE(expr, res) (expr)
> #endif
>
> -#define _IO_getc_unlocked(_fp) \
> - (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
> - ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
> +#define _IO_getc_unlocked(_fp) __getc_unlocked_body (_fp)
> #define _IO_peekc_unlocked(_fp) \
> (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
> && __underflow (_fp) == EOF ? EOF \
> : *(unsigned char *) (_fp)->_IO_read_ptr)
> -#define _IO_putc_unlocked(_ch, _fp) \
> - (_IO_BE ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end, 0) \
> - ? __overflow (_fp, (unsigned char) (_ch)) \
> - : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch)))
> +#define _IO_putc_unlocked(_ch, _fp) __putc_unlocked_body (_ch, _fp)
>
> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> # define _IO_getwc_unlocked(_fp) \
> @@ -427,8 +275,8 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
> : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch)))
> #endif
>
> -#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
> -#define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0)
> +#define _IO_feof_unlocked(_fp) __feof_unlocked_body (_fp)
> +#define _IO_ferror_unlocked(_fp) __ferror_unlocked_body (_fp)
Ok.
>
> extern int _IO_getc (_IO_FILE *__fp);
> extern int _IO_putc (int __c, _IO_FILE *__fp);
> diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h
> index eb42b22153c..4ab919031f7 100644
> --- a/libio/bits/stdio.h
> +++ b/libio/bits/stdio.h
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> +#ifndef _BITS_STDIO_H
> +#define _BITS_STDIO_H 1
> +
> #ifndef _STDIO_H
> # error "Never include <bits/stdio.h> directly; use <stdio.h> instead."
> #endif
> @@ -33,7 +36,7 @@
> # if !(__USE_FORTIFY_LEVEL > 0 && defined __fortify_function)
> /* Write formatted output to stdout from argument list ARG. */
> __STDIO_INLINE int
> -vprintf (const char *__restrict __fmt, _G_va_list __arg)
> +vprintf (const char *__restrict __fmt, __gnuc_va_list __arg)
> {
> return vfprintf (stdout, __fmt, __arg);
> }
> @@ -52,7 +55,7 @@ getchar (void)
> __STDIO_INLINE int
> fgetc_unlocked (FILE *__fp)
> {
> - return _IO_getc_unlocked (__fp);
> + return __getc_unlocked_body (__fp);
> }
> # endif /* misc */
>
> @@ -62,14 +65,14 @@ fgetc_unlocked (FILE *__fp)
> __STDIO_INLINE int
> getc_unlocked (FILE *__fp)
> {
> - return _IO_getc_unlocked (__fp);
> + return __getc_unlocked_body (__fp);
> }
>
> /* This is defined in POSIX.1:1996. */
> __STDIO_INLINE int
> getchar_unlocked (void)
> {
> - return _IO_getc_unlocked (stdin);
> + return __getc_unlocked_body (stdin);
> }
> # endif /* POSIX */
>
> @@ -87,7 +90,7 @@ putchar (int __c)
> __STDIO_INLINE int
> fputc_unlocked (int __c, FILE *__stream)
> {
> - return _IO_putc_unlocked (__c, __stream);
> + return __putc_unlocked_body (__c, __stream);
> }
> # endif /* misc */
>
> @@ -97,21 +100,21 @@ fputc_unlocked (int __c, FILE *__stream)
> __STDIO_INLINE int
> putc_unlocked (int __c, FILE *__stream)
> {
> - return _IO_putc_unlocked (__c, __stream);
> + return __putc_unlocked_body (__c, __stream);
> }
>
> /* This is defined in POSIX.1:1996. */
> __STDIO_INLINE int
> putchar_unlocked (int __c)
> {
> - return _IO_putc_unlocked (__c, stdout);
> + return __putc_unlocked_body (__c, stdout);
> }
> # endif /* POSIX */
>
>
> # ifdef __USE_GNU
> /* Like `getdelim', but reads up to a newline. */
> -__STDIO_INLINE _IO_ssize_t
> +__STDIO_INLINE __ssize_t
> getline (char **__lineptr, size_t *__n, FILE *__stream)
> {
> return __getdelim (__lineptr, __n, '\n', __stream);
> @@ -124,14 +127,14 @@ getline (char **__lineptr, size_t *__n, FILE *__stream)
> __STDIO_INLINE int
> __NTH (feof_unlocked (FILE *__stream))
> {
> - return _IO_feof_unlocked (__stream);
> + return __feof_unlocked_body (__stream);
> }
>
> /* Faster versions when locking is not required. */
> __STDIO_INLINE int
> __NTH (ferror_unlocked (FILE *__stream))
> {
> - return _IO_ferror_unlocked (__stream);
> + return __ferror_unlocked_body (__stream);
> }
> # endif /* misc */
>
> @@ -151,7 +154,7 @@ __NTH (ferror_unlocked (FILE *__stream))
> for (__cnt = (size_t) (size) * (size_t) (n); \
> __cnt > 0; --__cnt) \
> { \
> - int __c = _IO_getc_unlocked (__stream); \
> + int __c = getc_unlocked (__stream); \
> if (__c == EOF) \
> break; \
> *__ptr++ = __c; \
> @@ -174,7 +177,7 @@ __NTH (ferror_unlocked (FILE *__stream))
> size_t __cnt; \
> for (__cnt = (size_t) (size) * (size_t) (n); \
> __cnt > 0; --__cnt) \
> - if (_IO_putc_unlocked (*__ptr++, __stream) == EOF) \
> + if (putc_unlocked (*__ptr++, __stream) == EOF) \
> break; \
> ((size_t) (size) * (size_t) (n) - __cnt) \
> / (size_t) (size); }) \
> @@ -188,3 +191,5 @@ __NTH (ferror_unlocked (FILE *__stream))
>
> /* Define helper macro. */
> #undef __STDIO_INLINE
> +
> +#endif /* bits/stdio.h. */
Ok.
> diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h
> index 55302e91d0d..11651506a67 100644
> --- a/libio/bits/stdio2.h
> +++ b/libio/bits/stdio2.h
> @@ -16,6 +16,9 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> +#ifndef _BITS_STDIO2_H
> +#define _BITS_STDIO2_H 1
> +
> #ifndef _STDIO_H
> # error "Never include <bits/stdio2.h> directly; use <stdio.h> instead."
> #endif
> @@ -24,7 +27,7 @@ extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen,
> const char *__restrict __format, ...) __THROW;
> extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen,
> const char *__restrict __format,
> - _G_va_list __ap) __THROW;
> + __gnuc_va_list __ap) __THROW;
>
> #ifdef __va_arg_pack
> __fortify_function int
> @@ -41,7 +44,7 @@ __NTH (sprintf (char *__restrict __s, const char *__restrict __fmt, ...))
>
> __fortify_function int
> __NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt,
> - _G_va_list __ap))
> + __gnuc_va_list __ap))
> {
> return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
> __bos (__s), __fmt, __ap);
> @@ -54,7 +57,7 @@ extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag,
> ...) __THROW;
> extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag,
> size_t __slen, const char *__restrict __format,
> - _G_va_list __ap) __THROW;
> + __gnuc_va_list __ap) __THROW;
>
> # ifdef __va_arg_pack
> __fortify_function int
> @@ -72,7 +75,7 @@ __NTH (snprintf (char *__restrict __s, size_t __n,
>
> __fortify_function int
> __NTH (vsnprintf (char *__restrict __s, size_t __n,
> - const char *__restrict __fmt, _G_va_list __ap))
> + const char *__restrict __fmt, __gnuc_va_list __ap))
> {
> return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
> __bos (__s), __fmt, __ap);
> @@ -86,9 +89,9 @@ extern int __fprintf_chk (FILE *__restrict __stream, int __flag,
> const char *__restrict __format, ...);
> extern int __printf_chk (int __flag, const char *__restrict __format, ...);
> extern int __vfprintf_chk (FILE *__restrict __stream, int __flag,
> - const char *__restrict __format, _G_va_list __ap);
> + const char *__restrict __format, __gnuc_va_list __ap);
> extern int __vprintf_chk (int __flag, const char *__restrict __format,
> - _G_va_list __ap);
> + __gnuc_va_list __ap);
>
> # ifdef __va_arg_pack
> __fortify_function int
> @@ -111,7 +114,7 @@ printf (const char *__restrict __fmt, ...)
> # endif
>
> __fortify_function int
> -vprintf (const char *__restrict __fmt, _G_va_list __ap)
> +vprintf (const char *__restrict __fmt, __gnuc_va_list __ap)
> {
> #ifdef __USE_EXTERN_INLINES
> return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
> @@ -122,7 +125,7 @@ vprintf (const char *__restrict __fmt, _G_va_list __ap)
>
> __fortify_function int
> vfprintf (FILE *__restrict __stream,
> - const char *__restrict __fmt, _G_va_list __ap)
> + const char *__restrict __fmt, __gnuc_va_list __ap)
> {
> return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
> }
> @@ -131,7 +134,7 @@ vfprintf (FILE *__restrict __stream,
> extern int __dprintf_chk (int __fd, int __flag, const char *__restrict __fmt,
> ...) __attribute__ ((__format__ (__printf__, 3, 4)));
> extern int __vdprintf_chk (int __fd, int __flag,
> - const char *__restrict __fmt, _G_va_list __arg)
> + const char *__restrict __fmt, __gnuc_va_list __arg)
> __attribute__ ((__format__ (__printf__, 3, 0)));
>
> # ifdef __va_arg_pack
> @@ -147,7 +150,7 @@ dprintf (int __fd, const char *__restrict __fmt, ...)
> # endif
>
> __fortify_function int
> -vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap)
> +vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap)
> {
> return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
> }
> @@ -159,7 +162,7 @@ extern int __asprintf_chk (char **__restrict __ptr, int __flag,
> const char *__restrict __fmt, ...)
> __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur;
> extern int __vasprintf_chk (char **__restrict __ptr, int __flag,
> - const char *__restrict __fmt, _G_va_list __arg)
> + const char *__restrict __fmt, __gnuc_va_list __arg)
> __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur;
> extern int __obstack_printf_chk (struct obstack *__restrict __obstack,
> int __flag, const char *__restrict __format,
> @@ -168,7 +171,7 @@ extern int __obstack_printf_chk (struct obstack *__restrict __obstack,
> extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack,
> int __flag,
> const char *__restrict __format,
> - _G_va_list __args)
> + __gnuc_va_list __args)
> __THROW __attribute__ ((__format__ (__printf__, 3, 0)));
>
> # ifdef __va_arg_pack
> @@ -205,14 +208,14 @@ __NTH (obstack_printf (struct obstack *__restrict __obstack,
>
> __fortify_function int
> __NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
> - _G_va_list __ap))
> + __gnuc_va_list __ap))
> {
> return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
> }
>
> __fortify_function int
> __NTH (obstack_vprintf (struct obstack *__restrict __obstack,
> - const char *__restrict __fmt, _G_va_list __ap))
> + const char *__restrict __fmt, __gnuc_va_list __ap))
> {
> return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
> __ap);
> @@ -368,7 +371,7 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
>
> for (; __cnt > 0; --__cnt)
> {
> - int __c = _IO_getc_unlocked (__stream);
> + int __c = getc_unlocked (__stream);
> if (__c == EOF)
> break;
> *__cptr++ = __c;
> @@ -379,3 +382,5 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
> return __fread_unlocked_alias (__ptr, __size, __n, __stream);
> }
> #endif
> +
> +#endif /* bits/stdio2.h. */
Ok.
> diff --git a/libio/bits/types/__fpos64_t.h b/libio/bits/types/__fpos64_t.h
> new file mode 100644
> index 00000000000..06a6891154f
> --- /dev/null
> +++ b/libio/bits/types/__fpos64_t.h
> @@ -0,0 +1,16 @@
> +#ifndef _____fpos64_t_defined
> +#define _____fpos64_t_defined 1
> +
> +#include <bits/types.h>
> +#include <bits/types/__mbstate_t.h>
> +
> +/* The tag name of this struct is _G_fpos64_t to preserve historic
> + C++ mangled names for functions taking fpos_t and/or fpos64_t
> + arguments. That name should not be used in new code. */
> +typedef struct _G_fpos64_t
> +{
> + __off64_t __pos;
> + __mbstate_t __state;
> +} __fpos64_t;
> +
> +#endif
Ok.
> diff --git a/libio/bits/types/__fpos_t.h b/libio/bits/types/__fpos_t.h
> new file mode 100644
> index 00000000000..bb04576651b
> --- /dev/null
> +++ b/libio/bits/types/__fpos_t.h
> @@ -0,0 +1,16 @@
> +#ifndef _____fpos_t_defined
> +#define _____fpos_t_defined 1
> +
> +#include <bits/types.h>
> +#include <bits/types/__mbstate_t.h>
> +
> +/* The tag name of this struct is _G_fpos_t to preserve historic
> + C++ mangled names for functions taking fpos_t arguments.
> + That name should not be used in new code. */
> +typedef struct _G_fpos_t
> +{
> + __off_t __pos;
> + __mbstate_t __state;
> +} __fpos_t;
> +
> +#endif
Ok.
> diff --git a/libio/bits/types/cookie_io_functions_t.h b/libio/bits/types/cookie_io_functions_t.h
> new file mode 100644
> index 00000000000..cd4c0e19f4c
> --- /dev/null
> +++ b/libio/bits/types/cookie_io_functions_t.h
> @@ -0,0 +1,46 @@
> +#ifndef __cookie_io_functions_t_defined
> +#define __cookie_io_functions_t_defined 1
Not sure if file this size requires a copyright header.
> +
> +#include <bits/types.h>
> +
> +/* Functions to do I/O and file management for a stream. */
> +
> +/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF.
> + Return number of bytes read. */
> +typedef __ssize_t cookie_read_function_t (void *__cookie, char *__buf,
> + size_t __nbytes);
> +
> +/* Write NBYTES bytes pointed to by BUF to COOKIE. Write all NBYTES bytes
> + unless there is an error. Return number of bytes written. If
> + there is an error, return 0 and do not write anything. If the file
> + has been opened for append (__mode.__append set), then set the file
> + pointer to the end of the file and then do the write; if not, just
> + write at the current file pointer. */
> +typedef __ssize_t cookie_write_function_t (void *__cookie, const char *__buf,
> + size_t __nbytes);
> +
> +/* Move COOKIE's file position to *POS bytes from the
> + beginning of the file (if W is SEEK_SET),
> + the current position (if W is SEEK_CUR),
> + or the end of the file (if W is SEEK_END).
> + Set *POS to the new file position.
> + Returns zero if successful, nonzero if not. */
> +typedef int cookie_seek_function_t (void *__cookie, __off64_t *__pos, int __w);
> +
> +/* Close COOKIE. */
> +typedef int cookie_close_function_t (void *__cookie);
> +
> +/* The structure with the cookie function pointers.
> + The tag name of this struct is _IO_cookie_io_functions_t to
> + preserve historic C++ mangled names for functions taking
> + cookie_io_functions_t arguments. That name should not be used in
> + new code. */
> +typedef struct _IO_cookie_io_functions_t
> +{
> + cookie_read_function_t *read; /* Read bytes. */
> + cookie_write_function_t *write; /* Write bytes. */
> + cookie_seek_function_t *seek; /* Seek/tell file position. */
> + cookie_close_function_t *close; /* Close file. */
> +} cookie_io_functions_t;
> +
> +#endif
Ok.
> diff --git a/libio/bits/types/struct_FILE.h b/libio/bits/types/struct_FILE.h
> new file mode 100644
> index 00000000000..a120c762685
> --- /dev/null
> +++ b/libio/bits/types/struct_FILE.h
> @@ -0,0 +1,120 @@
> +/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#ifndef __struct_FILE_defined
> +#define __struct_FILE_defined 1
> +
> +/* Caution: The contents of this file are not part of the official
> + stdio.h API. However, much of it is part of the official *binary*
> + interface, and therefore cannot be changed. */
> +
> +#if defined _IO_USE_OLD_IO_FILE && !defined _LIBC
> +# error "_IO_USE_OLD_IO_FILE should only be defined when building libc itself"
> +#endif
> +
> +#if defined _IO_lock_t_defined && !defined _LIBC
> +# error "_IO_lock_t_defined should only be defined when building libc itself"
> +#endif
Ok.
> +
> +#include <bits/types.h>
> +
> +struct _IO_FILE;
> +struct _IO_marker;
> +struct _IO_codecvt;
> +struct _IO_wide_data;
> +
> +/* During the build of glibc itself, _IO_lock_t will already have been
> + defined by internal headers. */
> +#ifndef _IO_lock_t_defined
> +typedef void _IO_lock_t;
> +#endif
> +
> +/* The tag name of this struct is _IO_FILE to preserve historic
> + C++ mangled names for functions taking FILE* arguments.
> + That name should not be used in new code. */
> +struct _IO_FILE
> +{
> + int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
> +
> + /* The following pointers correspond to the C++ streambuf protocol. */
> + char *_IO_read_ptr; /* Current read pointer */
> + char *_IO_read_end; /* End of get area. */
> + char *_IO_read_base; /* Start of putback+get area. */
> + char *_IO_write_base; /* Start of put area. */
> + char *_IO_write_ptr; /* Current put pointer. */
> + char *_IO_write_end; /* End of put area. */
> + char *_IO_buf_base; /* Start of reserve area. */
> + char *_IO_buf_end; /* End of reserve area. */
> +
> + /* The following fields are used to support backing up and undo. */
> + char *_IO_save_base; /* Pointer to start of non-current get area. */
> + char *_IO_backup_base; /* Pointer to first valid character of backup area */
> + char *_IO_save_end; /* Pointer to end of non-current get area. */
> +
> + struct _IO_marker *_markers;
> +
> + struct _IO_FILE *_chain;
> +
> + int _fileno;
> + int _flags2;
> + __off_t _old_offset; /* This used to be _offset but it's too small. */
> +
> + /* 1+column number of pbase(); 0 is unknown. */
> + unsigned short _cur_column;
> + signed char _vtable_offset;
> + char _shortbuf[1];
> +
> + _IO_lock_t *_lock;
> +#ifdef _IO_USE_OLD_IO_FILE
> +};
> +
> +struct _IO_FILE_complete
> +{
> + struct _IO_FILE _file;
> +#endif
> + __off64_t _offset;
> + /* Wide character stream stuff. */
> + struct _IO_codecvt *_codecvt;
> + struct _IO_wide_data *_wide_data;
> + struct _IO_FILE *_freeres_list;
> + void *_freeres_buf;
> + size_t __pad5;
> + int _mode;
> + /* Make sure we don't get into trouble again. */
> + char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
> +};
> +
> +/* These macros are used by bits/stdio.h and internal headers. */
> +#define __getc_unlocked_body(_fp) \
> + (__glibc_unlikely ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end) \
> + ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
> +
> +#define __putc_unlocked_body(_ch, _fp) \
> + (__glibc_unlikely ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end) \
> + ? __overflow (_fp, (unsigned char) (_ch)) \
> + : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch)))
> +
> +#define _IO_EOF_SEEN 0x10
> +#define __feof_unlocked_body(_fp) (((_fp)->_flags & _IO_EOF_SEEN) != 0)
> +
> +#define _IO_ERR_SEEN 0x20
> +#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0)
> +
> +#define _IO_USER_LOCK 0x8000
> +/* Many more flag bits are defined internally. */
> +
> +#endif
Ok.
> diff --git a/libio/iolibio.h b/libio/iolibio.h
> index 621b31cff1f..7814b1d4e56 100644
> --- a/libio/iolibio.h
> +++ b/libio/iolibio.h
> @@ -1,4 +1,8 @@
> +#ifndef _IOLIBIO_H
> +#define _IOLIBIO_H 1
> +
> #include <stdio.h>
> +#include <bits/libio.h>
>
> /* These emulate stdio functionality, but with a different name
> (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */
> @@ -94,3 +98,5 @@ _IO_FILE *__old_freopen (const char *, const char *, _IO_FILE *) __THROW;
> #ifdef __cplusplus
> }
> #endif
> +
> +#endif /* iolibio.h. */
Ok.
> diff --git a/libio/libio.h b/libio/libio.h
> deleted file mode 100644
> index 47a25083ce3..00000000000
> --- a/libio/libio.h
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/* Copyright (C) 2017-2018 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#ifndef _LIBIO_H
> -#define _LIBIO_H 1
> -
> -#warning "<libio.h> is deprecated; use <stdio.h> instead."
> -
> -#include <bits/libio.h>
> -
> -#endif
Ok.
> diff --git a/libio/libioP.h b/libio/libioP.h
> index 068ceb2615a..ac66f95f8d4 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -32,6 +32,9 @@
>
> FIXME: All of the C++ cruft eventually needs to go away. */
>
> +#ifndef _LIBIOP_H
> +#define _LIBIOP_H 1
> +
> #include <stddef.h>
>
> #include <errno.h>
> @@ -39,6 +42,8 @@
>
> #include <math_ldbl_opt.h>
>
> +#include <stdio.h>
> +#include <bits/libio.h>
> #include "iolibio.h"
>
> #ifdef __cplusplus
> @@ -876,3 +881,5 @@ IO_validate_vtable (const struct _IO_jump_t *vtable)
> _IO_vtable_check ();
> return vtable;
> }
> +
> +#endif /* libioP.h. */
Ok.
> diff --git a/libio/stdio.h b/libio/stdio.h
> index 33de3813bbd..731f8e56f4c 100644
> --- a/libio/stdio.h
> +++ b/libio/stdio.h
> @@ -32,18 +32,24 @@ __BEGIN_DECLS
> #define __need_NULL
> #include <stddef.h>
>
> +#define __need___va_list
> +#include <stdarg.h>
> +
> #include <bits/types.h>
> +#include <bits/types/__fpos_t.h>
> +#include <bits/types/__fpos64_t.h>
> #include <bits/types/__FILE.h>
> #include <bits/types/FILE.h>
> +#include <bits/types/struct_FILE.h>
>
> -#define _STDIO_USES_IOSTREAM
> -
> -#include <bits/libio.h>
> +#ifdef __USE_GNU
> +# include <bits/types/cookie_io_functions_t.h>
> +#endif
>
> #if defined __USE_XOPEN || defined __USE_XOPEN2K8
> # ifdef __GNUC__
> # ifndef _VA_LIST_DEFINED
> -typedef _G_va_list va_list;
> +typedef __gnuc_va_list va_list;
> # define _VA_LIST_DEFINED
> # endif
> # else
> @@ -75,12 +81,12 @@ typedef __ssize_t ssize_t;
>
> /* The type of the second argument to `fgetpos' and `fsetpos'. */
> #ifndef __USE_FILE_OFFSET64
> -typedef _G_fpos_t fpos_t;
> +typedef __fpos_t fpos_t;
> #else
> -typedef _G_fpos64_t fpos_t;
> +typedef __fpos64_t fpos_t;
> #endif
> #ifdef __USE_LARGEFILE64
> -typedef _G_fpos64_t fpos64_t;
> +typedef __fpos64_t fpos64_t;
> #endif
>
> /* The possibilities for the third argument to `setvbuf'. */
> @@ -90,16 +96,12 @@ typedef _G_fpos64_t fpos64_t;
>
>
> /* Default buffer size. */
> -#ifndef BUFSIZ
> -# define BUFSIZ _IO_BUFSIZ
> -#endif
> +#define BUFSIZ 8192
I think a possible subsqueuent cleanup is to remove _IO_BUFSIZE utilization
within glibc as well.
>
>
> -/* End of file character.
> - Some things throughout the library rely on this being -1. */
> -#ifndef EOF
> -# define EOF (-1)
> -#endif
> +/* The value returned by fgetc and similar functions to indicate the
> + end of the file. */
> +#define EOF (-1)
EOF is being define on both libio/libioP.h and libio/stdio.h. Shouldn't we
cleanup the libioP.h one?
>
>
> /* The possibilities for the third argument to `fseek'.
> @@ -132,9 +134,9 @@ typedef _G_fpos64_t fpos64_t;
>
>
> /* Standard streams. */
> -extern struct _IO_FILE *stdin; /* Standard input stream. */
> -extern struct _IO_FILE *stdout; /* Standard output stream. */
> -extern struct _IO_FILE *stderr; /* Standard error output stream. */
> +extern FILE *stdin; /* Standard input stream. */
> +extern FILE *stdout; /* Standard output stream. */
> +extern FILE *stderr; /* Standard error output stream. */
> /* C89/C99 say they're macros. Make them happy. */
> #define stdin stdin
> #define stdout stdout
> @@ -270,7 +272,7 @@ extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur;
> and uses the given functions for input and output. */
> extern FILE *fopencookie (void *__restrict __magic_cookie,
> const char *__restrict __modes,
> - _IO_cookie_io_functions_t __io_funcs) __THROW __wur;
> + cookie_io_functions_t __io_funcs) __THROW __wur;
> #endif
>
> #if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
Ok.
> @@ -325,15 +327,15 @@ extern int sprintf (char *__restrict __s,
> This function is a possible cancellation point and therefore not
> marked with __THROW. */
> extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
> - _G_va_list __arg);
> + __gnuc_va_list __arg);
> /* Write formatted output to stdout from argument list ARG.
>
> This function is a possible cancellation point and therefore not
> marked with __THROW. */
> -extern int vprintf (const char *__restrict __format, _G_va_list __arg);
> +extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);
> /* Write formatted output to S from argument list ARG. */
> extern int vsprintf (char *__restrict __s, const char *__restrict __format,
> - _G_va_list __arg) __THROWNL;
> + __gnuc_va_list __arg) __THROWNL;
>
> #if defined __USE_ISOC99 || defined __USE_UNIX98
> /* Maximum chars of output to write in MAXLEN. */
> @@ -342,7 +344,7 @@ extern int snprintf (char *__restrict __s, size_t __maxlen,
> __THROWNL __attribute__ ((__format__ (__printf__, 3, 4)));
>
> extern int vsnprintf (char *__restrict __s, size_t __maxlen,
> - const char *__restrict __format, _G_va_list __arg)
> + const char *__restrict __format, __gnuc_va_list __arg)
> __THROWNL __attribute__ ((__format__ (__printf__, 3, 0)));
> #endif
>
> @@ -350,7 +352,7 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen,
> /* Write formatted output to a string dynamically allocated with `malloc'.
> Store the address of the string in *PTR. */
> extern int vasprintf (char **__restrict __ptr, const char *__restrict __f,
> - _G_va_list __arg)
> + __gnuc_va_list __arg)
> __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))) __wur;
> extern int __asprintf (char **__restrict __ptr,
> const char *__restrict __fmt, ...)
> @@ -363,7 +365,7 @@ extern int asprintf (char **__restrict __ptr,
> #ifdef __USE_XOPEN2K8
> /* Write formatted output to a file descriptor. */
> extern int vdprintf (int __fd, const char *__restrict __fmt,
> - _G_va_list __arg)
> + __gnuc_va_list __arg)
> __attribute__ ((__format__ (__printf__, 2, 0)));
> extern int dprintf (int __fd, const char *__restrict __fmt, ...)
> __attribute__ ((__format__ (__printf__, 2, 3)));
> @@ -418,19 +420,19 @@ extern int __isoc99_sscanf (const char *__restrict __s,
> This function is a possible cancellation point and therefore not
> marked with __THROW. */
> extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
> - _G_va_list __arg)
> + __gnuc_va_list __arg)
> __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
>
> /* Read formatted input from stdin into argument list ARG.
>
> This function is a possible cancellation point and therefore not
> marked with __THROW. */
> -extern int vscanf (const char *__restrict __format, _G_va_list __arg)
> +extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)
> __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
>
> /* Read formatted input from S into argument list ARG. */
> extern int vsscanf (const char *__restrict __s,
> - const char *__restrict __format, _G_va_list __arg)
> + const char *__restrict __format, __gnuc_va_list __arg)
> __THROW __attribute__ ((__format__ (__scanf__, 2, 0)));
>
> # if !defined __USE_GNU \
> @@ -442,26 +444,26 @@ extern int vsscanf (const char *__restrict __s,
> s, S or [. */
> extern int __REDIRECT (vfscanf,
> (FILE *__restrict __s,
> - const char *__restrict __format, _G_va_list __arg),
> + const char *__restrict __format, __gnuc_va_list __arg),
> __isoc99_vfscanf)
> __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
> extern int __REDIRECT (vscanf, (const char *__restrict __format,
> - _G_va_list __arg), __isoc99_vscanf)
> + __gnuc_va_list __arg), __isoc99_vscanf)
> __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
> extern int __REDIRECT_NTH (vsscanf,
> (const char *__restrict __s,
> const char *__restrict __format,
> - _G_va_list __arg), __isoc99_vsscanf)
> + __gnuc_va_list __arg), __isoc99_vsscanf)
> __attribute__ ((__format__ (__scanf__, 2, 0)));
> # else
> extern int __isoc99_vfscanf (FILE *__restrict __s,
> const char *__restrict __format,
> - _G_va_list __arg) __wur;
> + __gnuc_va_list __arg) __wur;
> extern int __isoc99_vscanf (const char *__restrict __format,
> - _G_va_list __arg) __wur;
> + __gnuc_va_list __arg) __wur;
> extern int __isoc99_vsscanf (const char *__restrict __s,
> const char *__restrict __format,
> - _G_va_list __arg) __THROW;
> + __gnuc_va_list __arg) __THROW;
> # define vfscanf __isoc99_vfscanf
> # define vscanf __isoc99_vscanf
> # define vsscanf __isoc99_vsscanf
Ok.
> @@ -592,12 +594,12 @@ extern char *fgets_unlocked (char *__restrict __s, int __n,
> cancellation point. But due to similarity with an POSIX interface
> or due to the implementation they are cancellation points and
> therefore not marked with __THROW. */
> -extern _IO_ssize_t __getdelim (char **__restrict __lineptr,
> - size_t *__restrict __n, int __delimiter,
> - FILE *__restrict __stream) __wur;
> -extern _IO_ssize_t getdelim (char **__restrict __lineptr,
> - size_t *__restrict __n, int __delimiter,
> - FILE *__restrict __stream) __wur;
> +extern __ssize_t __getdelim (char **__restrict __lineptr,
> + size_t *__restrict __n, int __delimiter,
> + FILE *__restrict __stream) __wur;
> +extern __ssize_t getdelim (char **__restrict __lineptr,
> + size_t *__restrict __n, int __delimiter,
> + FILE *__restrict __stream) __wur;
>
> /* Like `getdelim', but reads up to a newline.
>
> @@ -605,9 +607,9 @@ extern _IO_ssize_t getdelim (char **__restrict __lineptr,
> cancellation point. But due to similarity with an POSIX interface
> or due to the implementation it is a cancellation point and
> therefore not marked with __THROW. */
> -extern _IO_ssize_t getline (char **__restrict __lineptr,
> - size_t *__restrict __n,
> - FILE *__restrict __stream) __wur;
> +extern __ssize_t getline (char **__restrict __lineptr,
> + size_t *__restrict __n,
> + FILE *__restrict __stream) __wur;
> #endif
>
>
Ok.
> @@ -820,7 +822,7 @@ extern int obstack_printf (struct obstack *__restrict __obstack,
> __THROWNL __attribute__ ((__format__ (__printf__, 2, 3)));
> extern int obstack_vprintf (struct obstack *__restrict __obstack,
> const char *__restrict __format,
> - _G_va_list __args)
> + __gnuc_va_list __args)
> __THROWNL __attribute__ ((__format__ (__printf__, 2, 0)));
> #endif /* Use GNU. */
>
> @@ -845,6 +847,11 @@ extern void funlockfile (FILE *__stream) __THROW;
> # include <bits/getopt_posix.h>
> #endif
>
> +/* Slow-path routines used by the optimized inline functions in
> + bits/stdio.h. */
> +extern int __uflow (FILE *);
> +extern int __overflow (FILE *, int);
> +
> /* If we are compiling with optimizing read this file. It contains
> several optimizing inline functions and macros. */
> #ifdef __USE_EXTERN_INLINES
Ok.
> diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh
> index 3384e1c3e76..7ffd2b8e749 100644
> --- a/scripts/check-installed-headers.sh
> +++ b/scripts/check-installed-headers.sh
> @@ -84,11 +84,6 @@ for header in "$@"; do
> (sys/elf.h)
> continue;;
>
> - # libio.h and _G_config.h are deprecation stubs containing #warnings
> - # to use stdio.h instead.
> - (libio.h | _G_config.h)
> - continue;;
> -
> # sys/sysctl.h is unsupported for x32.
> (sys/sysctl.h)
> case "$is_x32" in
Ok.
> diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h
> index 9994869098b..05a64acb2cf 100644
> --- a/sysdeps/unix/sysv/linux/bits/_G_config.h
> +++ b/sysdeps/unix/sysv/linux/bits/_G_config.h
> @@ -4,10 +4,6 @@
> #ifndef _BITS_G_CONFIG_H
> #define _BITS_G_CONFIG_H 1
>
> -#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H
> -# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead."
> -#endif
> -
> /* Define types for libio in terms of the standard internal type names. */
>
> #include <bits/types.h>
> @@ -19,20 +15,16 @@
> #include <stddef.h>
>
> #include <bits/types/__mbstate_t.h>
> +#include <bits/types/__fpos_t.h>
> +#include <bits/types/__fpos64_t.h>
> +
> +#define _G_fpos_t __fpos_t
> +#define _G_fpos64_t __fpos64_t
> +
> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> # include <bits/types/wint_t.h>
> #endif
>
> -typedef struct
> -{
> - __off_t __pos;
> - __mbstate_t __state;
> -} _G_fpos_t;
> -typedef struct
> -{
> - __off64_t __pos;
> - __mbstate_t __state;
> -} _G_fpos64_t;
> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> # include <gconv.h>
> typedef union
>
Ok.