diff options
| author | Zack Weinberg <zackw@panix.com> | 2018-02-02 19:36:42 -0500 |
|---|---|---|
| committer | Zack Weinberg <zackw@panix.com> | 2018-02-07 10:07:31 -0500 |
| commit | a4fea3f2c3253b9ae6ffacd3747034ccbe56bc60 (patch) | |
| tree | 8700a2647ffc3108fbdada0ebb0be1b437b99166 | |
| parent | 8b4a118222c7ed41bc653943b542915946dff1dd (diff) | |
| download | glibc-a4fea3f2c3253b9ae6ffacd3747034ccbe56bc60.tar.xz glibc-a4fea3f2c3253b9ae6ffacd3747034ccbe56bc60.zip | |
Don't install libio.h or _G_config.h.
We shipped 2.27 with libio.h and _G_config.h still installed but
issuing warnings when used. Let's stop installing them early in 2.28
so that we have plenty of time to think of another plan if there are
problems.
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 can be 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.
Tested on x86_64-linux; in addition to the test suite, I installed the
library in a sysroot and verified that a simple program that uses
stdio.h could be compiled against the installed library, and I also
verified that installed stripped libraries are unchanged.
* 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.
| -rw-r--r-- | ChangeLog | 65 | ||||
| -rw-r--r-- | NEWS | 4 | ||||
| -rw-r--r-- | bits/_G_config.h | 20 | ||||
| -rw-r--r-- | conform/data/stdio.h-data | 2 | ||||
| -rw-r--r-- | include/bits/types/__fpos64_t.h | 1 | ||||
| -rw-r--r-- | include/bits/types/__fpos_t.h | 1 | ||||
| -rw-r--r-- | include/bits/types/cookie_io_functions_t.h | 1 | ||||
| -rw-r--r-- | include/bits/types/struct_FILE.h | 1 | ||||
| -rw-r--r-- | include/stdio.h | 5 | ||||
| -rw-r--r-- | libio/Makefile | 9 | ||||
| -rw-r--r-- | libio/_G_config.h | 25 | ||||
| -rw-r--r-- | libio/bits/libio.h | 194 | ||||
| -rw-r--r-- | libio/bits/stdio.h | 29 | ||||
| -rw-r--r-- | libio/bits/stdio2.h | 35 | ||||
| -rw-r--r-- | libio/bits/types/__fpos64_t.h | 16 | ||||
| -rw-r--r-- | libio/bits/types/__fpos_t.h | 16 | ||||
| -rw-r--r-- | libio/bits/types/cookie_io_functions_t.h | 63 | ||||
| -rw-r--r-- | libio/bits/types/struct_FILE.h | 120 | ||||
| -rw-r--r-- | libio/iolibio.h | 6 | ||||
| -rw-r--r-- | libio/libio.h | 25 | ||||
| -rw-r--r-- | libio/libioP.h | 7 | ||||
| -rw-r--r-- | libio/stdio.h | 95 | ||||
| -rw-r--r-- | scripts/check-installed-headers.sh | 5 | ||||
| -rw-r--r-- | sysdeps/unix/sysv/linux/bits/_G_config.h | 20 |
24 files changed, 433 insertions, 332 deletions
@@ -1,3 +1,68 @@ +2018-02-07 Zack Weinberg <zackw@panix.com> + + * 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. + + 2018-02-07 Joseph Myers <joseph@codesourcery.com> [BZ #15105] @@ -13,6 +13,10 @@ Major new features: Deprecated and removed features, and other changes affecting compatibility: + * 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 to call alternative names for the same functions. If you hoped getc and diff --git a/bits/_G_config.h b/bits/_G_config.h index 2b60d29f5f..8c81bc4278 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 - /* 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 f69802cc70..3ef2460661 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 __gnuc_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 0000000000..68cc4e8b66 --- /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 0000000000..2dcdc98d75 --- /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 0000000000..87f7930c6e --- /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 0000000000..971407292b --- /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 f1e987ae5e..3b6da17d82 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 918a86bb74..3e08ed0eeb 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 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 68de2fcaa0..0000000000 --- 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 diff --git a/libio/bits/libio.h b/libio/bits/libio.h index fae5b932a1..cefc2c855b 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> #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 }; /* 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 -}; #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 |
