summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--Makefile3
-rw-r--r--NEWS5
-rw-r--r--bits/libc-header-start.h43
-rw-r--r--include/features.h17
-rw-r--r--libio/stdio.h9
-rw-r--r--manual/creature.texi8
-rw-r--r--string/string.h8
-rw-r--r--wcsmbs/wchar.h5
9 files changed, 115 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 8c2eb8e48f..c2ff29c1f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2016-08-02 Joseph Myers <joseph@codesourcery.com>
+
+ * bits/libc-header-start.h: New file.
+ * Makefile (headers): Add bits/libc-header-start.h.
+ * include/features.h (__STDC_WANT_LIB_EXT2__): Document.
+ (__GLIBC_USE): New macro.
+ * libio/stdio.h: Define
+ __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include
+ <bits/libc-header-start.h> instead of including <features.h>.
+ (fmemopen): Declare also if [__GLIBC_USE (LIB_EXT2)].
+ (open_memstream): Likewise.
+ (vasprintf): Declare if [__GLIBC_USE (LIB_EXT2)], not [__USE_GNU].
+ (__asprintf): Likewise.
+ (asprintf): Likewise.
+ (__getdelim): Declare also if [__GLIBC_USE (LIB_EXT2)].
+ (getdelim): Likewise.
+ (getline): Likewise.
+ * string/string.h: Define
+ __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include
+ <bits/libc-header-start.h> instead of including <features.h>.
+ (strdup): Declare also if [__GLIBC_USE (LIB_EXT2)]
+ (strndup): Likewise.
+ * wcsmbs/wchar.h: Define
+ __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include
+ <bits/libc-header-start.h> instead of including <features.h>.
+ (open_wmemstream): Declare also if [__GLIBC_USE (LIB_EXT2)].
+ * manual/creature.texi (__STDC_WANT_LIB_EXT2__): Document macro.
+
2016-08-02 Florian Weimer <fweimer@redhat.com>
Support linking against compatibility symbols, for use in tests.
diff --git a/Makefile b/Makefile
index 32748b3d2e..4478c97126 100644
--- a/Makefile
+++ b/Makefile
@@ -60,7 +60,8 @@ endif # $(AUTOCONF) = no
$(addprefix install-, no-libc.a bin lib data headers others)
headers := limits.h values.h features.h gnu-versions.h \
- bits/xopen_lim.h gnu/libc-version.h stdc-predef.h
+ bits/xopen_lim.h gnu/libc-version.h stdc-predef.h \
+ bits/libc-header-start.h
echo-headers: subdir_echo-headers
diff --git a/NEWS b/NEWS
index 8169e8fe8b..d057c06b57 100644
--- a/NEWS
+++ b/NEWS
@@ -7,7 +7,10 @@ using `glibc' in the "product" field.
Version 2.25
-[Add important changes here]
+* The feature test macro __STDC_WANT_LIB_EXT2__, from ISO/IEC TR
+ 24731-2:2010, is supported to enable declarations of functions from that
+ TR. Note that not all functions from that TR are supported by the GNU C
+ Library.
Security related changes:
diff --git a/bits/libc-header-start.h b/bits/libc-header-start.h
new file mode 100644
index 0000000000..c6663074a8
--- /dev/null
+++ b/bits/libc-header-start.h
@@ -0,0 +1,43 @@
+/* Handle feature test macros at the start of a header.
+ Copyright (C) 2016 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/>. */
+
+/* This header is internal to glibc and should not be included outside
+ of glibc headers. Headers including it must define
+ __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION first. This header
+ cannot have multiple include guards because ISO C feature test
+ macros depend on the definition of the macro when an affected
+ header is included, not when the first system header is
+ included. */
+
+#ifndef __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+# error "Never include <bits/libc-header-start.h> directly."
+#endif
+
+#undef __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+
+#include <features.h>
+
+/* ISO/IEC TR 24731-2:2010 defines the __STDC_WANT_LIB_EXT2__
+ macro. */
+#undef __GLIBC_USE_LIB_EXT2
+#if (defined __USE_GNU \
+ || (defined __STDC_WANT_LIB_EXT2__ && __STDC_WANT_LIB_EXT2__ > 0))
+# define __GLIBC_USE_LIB_EXT2 1
+#else
+# define __GLIBC_USE_LIB_EXT2 0
+#endif
diff --git a/include/features.h b/include/features.h
index 56d1c571b6..404014115a 100644
--- a/include/features.h
+++ b/include/features.h
@@ -24,6 +24,7 @@
__STRICT_ANSI__ ISO Standard C.
_ISOC99_SOURCE Extensions to ISO C89 from ISO C99.
_ISOC11_SOURCE Extensions to ISO C99 from ISO C11.
+ __STDC_WANT_LIB_EXT2__ Extensions to ISO C99 from TR 27431-2:2010.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
@@ -58,6 +59,10 @@
These are defined by this file and are used by the
header files to decide what to declare or define:
+ __GLIBC_USE (F) Define things from feature set F. This is defined
+ to 1 or 0; the subsequent macros are either defined
+ or undefined, and those tests should be moved to
+ __GLIBC_USE.
__USE_ISOC11 Define ISO C11 things.
__USE_ISOC99 Define ISO C99 things.
__USE_ISOC95 Define ISO C90 AMD1 (C95) things.
@@ -90,7 +95,14 @@
explicitly undefined if they are not explicitly defined.
Feature-test macros that are not defined by the user or compiler
but are implied by the other feature-test macros defined (or by the
- lack of any definitions) are defined by the file. */
+ lack of any definitions) are defined by the file.
+
+ ISO C feature test macros depend on the definition of the macro
+ when an affected header is included, not when the first system
+ header is included, and so they are handled in
+ <bits/libc-header-start.h>, which does not have a multiple include
+ guard. Feature test macros that can be handled from the first
+ system header included are handled here. */
/* Undefine everything, so we get a clean slate. */
@@ -139,6 +151,9 @@
# define __GNUC_PREREQ(maj, min) 0
#endif
+/* Whether to use feature set F. */
+#define __GLIBC_USE(F) __GLIBC_USE_ ## F
+
/* _BSD_SOURCE and _SVID_SOURCE are deprecated aliases for
_DEFAULT_SOURCE. If _DEFAULT_SOURCE is present we do not
issue a warning; the expectation is that the source is being
diff --git a/libio/stdio.h b/libio/stdio.h
index 4511c3cc69..e37f901e5f 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -24,7 +24,8 @@
#if !defined __need_FILE && !defined __need___FILE
# define _STDIO_H 1
-# include <features.h>
+# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+# include <bits/libc-header-start.h>
__BEGIN_DECLS
@@ -316,7 +317,7 @@ extern FILE *fopencookie (void *__restrict __magic_cookie,
_IO_cookie_io_functions_t __io_funcs) __THROW __wur;
#endif
-#ifdef __USE_XOPEN2K8
+#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
/* Create a new stream that refers to a memory buffer. */
extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
__THROW __wur;
@@ -395,7 +396,7 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen,
__END_NAMESPACE_C99
#endif
-#ifdef __USE_GNU
+#if __GLIBC_USE (LIB_EXT2)
/* 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,
@@ -653,7 +654,7 @@ extern char *fgets_unlocked (char *__restrict __s, int __n,
#endif
-#ifdef __USE_XOPEN2K8
+#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
/* Read up to (and including) a DELIMITER from STREAM into *LINEPTR
(and null-terminate it). *LINEPTR is a pointer returned from malloc (or
NULL), pointing to *N characters of space. It is realloc'd as
diff --git a/manual/creature.texi b/manual/creature.texi
index 3c686165f1..65c5928343 100644
--- a/manual/creature.texi
+++ b/manual/creature.texi
@@ -166,6 +166,14 @@ macro @code{_ISOC99_SOURCE} should be defined.
@end defvr
@comment (none)
+@comment ISO
+@defvr Macro __STDC_WANT_LIB_EXT2__
+If you define this macro to the value @code{1}, features from ISO/IEC
+TR 24731-2:2010 (Dynamic Allocation Functions) are enabled. Only some
+of the features from this TR are supported by @theglibc{}.
+@end defvr
+
+@comment (none)
@comment GNU
@defvr Macro _GNU_SOURCE
If you define this macro, everything is included: @w{ISO C89}, @w{ISO
diff --git a/string/string.h b/string/string.h
index c7f8fde7b8..57deaa4191 100644
--- a/string/string.h
+++ b/string/string.h
@@ -22,7 +22,8 @@
#ifndef _STRING_H
#define _STRING_H 1
-#include <features.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
__BEGIN_DECLS
@@ -166,7 +167,8 @@ extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n,
__locale_t __l) __THROW __nonnull ((2, 4));
#endif
-#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
+#if (defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 \
+ || __GLIBC_USE (LIB_EXT2))
/* Duplicate S, returning an identical malloc'd string. */
extern char *strdup (const char *__s)
__THROW __attribute_malloc__ __nonnull ((1));
@@ -175,7 +177,7 @@ extern char *strdup (const char *__s)
/* Return a malloc'd copy of at most N bytes of STRING. The
resultant string is terminated even if no null terminator
appears before STRING[N]. */
-#if defined __USE_XOPEN2K8
+#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
extern char *strndup (const char *__string, size_t __n)
__THROW __attribute_malloc__ __nonnull ((1));
#endif
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index e4134167dc..9686fcde32 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -24,7 +24,8 @@
#if !defined __need_mbstate_t && !defined __need_wint_t
# define _WCHAR_H 1
-# include <features.h>
+# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+# include <bits/libc-header-start.h>
#endif
#ifdef _WCHAR_H
@@ -574,10 +575,12 @@ extern wchar_t *wcpcpy (wchar_t *__restrict __dest,
extern wchar_t *wcpncpy (wchar_t *__restrict __dest,
const wchar_t *__restrict __src, size_t __n)
__THROW;
+#endif
/* Wide character I/O functions. */
+#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
/* Like OPEN_MEMSTREAM, but the stream is wide oriented and produces
a wide character string. */
extern __FILE *open_wmemstream (wchar_t **__bufloc, size_t *__sizeloc) __THROW;