version 1.1.1.2, 2012/05/29 09:29:43
|
version 1.1.1.3, 2021/03/17 13:38:46
|
Line 1
|
Line 1
|
/* A GNU-like <stdio.h>. |
/* A GNU-like <stdio.h>. |
|
|
Copyright (C) 2004, 2007-2011 Free Software Foundation, Inc. | Copyright (C) 2004, 2007-2019 Free Software Foundation, Inc. |
|
|
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
it under the terms of the GNU General Public License as published by |
Line 13
|
Line 13
|
GNU General Public License for more details. |
GNU General Public License for more details. |
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, | along with this program; if not, see <https://www.gnu.org/licenses/>. */ |
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | |
|
|
#if __GNUC__ >= 3 |
#if __GNUC__ >= 3 |
@PRAGMA_SYSTEM_HEADER@ |
@PRAGMA_SYSTEM_HEADER@ |
Line 53
|
Line 52
|
#include <stddef.h> |
#include <stddef.h> |
|
|
/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8 |
/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8 |
and eglibc 2.11.2. */ | and eglibc 2.11.2. |
| May also define off_t to a 64-bit type on native Windows. */ |
#include <sys/types.h> |
#include <sys/types.h> |
|
|
/* The __attribute__ feature is available in gcc versions 2.5 and later. |
/* The __attribute__ feature is available in gcc versions 2.5 and later. |
Line 84
|
Line 84
|
except that it indicates to GCC that the supported format string directives |
except that it indicates to GCC that the supported format string directives |
are the ones of the system printf(), rather than the ones standardized by |
are the ones of the system printf(), rather than the ones standardized by |
ISO C99 and POSIX. */ |
ISO C99 and POSIX. */ |
#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ | #if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU |
| # define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ |
| _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument) |
| #else |
| # define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \ |
_GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) |
_GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument)) |
|
#endif |
|
|
/* _GL_ATTRIBUTE_FORMAT_SCANF |
/* _GL_ATTRIBUTE_FORMAT_SCANF |
indicates to GCC that the function takes a format string and arguments, |
indicates to GCC that the function takes a format string and arguments, |
Line 106
|
Line 111
|
#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \ |
#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \ |
_GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) |
_GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument)) |
|
|
/* Solaris 10 declares renameat in <unistd.h>, not in <stdio.h>. */ | /* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>. */ |
/* But in any case avoid namespace pollution on glibc systems. */ |
/* But in any case avoid namespace pollution on glibc systems. */ |
#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __sun \ | #if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \ |
&& ! defined __GLIBC__ |
&& ! defined __GLIBC__ |
# include <unistd.h> |
# include <unistd.h> |
#endif |
#endif |
|
|
|
/* Android 4.3 declares renameat in <sys/stat.h>, not in <stdio.h>. */ |
|
/* But in any case avoid namespace pollution on glibc systems. */ |
|
#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \ |
|
&& ! defined __GLIBC__ |
|
# include <sys/stat.h> |
|
#endif |
|
|
|
/* MSVC declares 'perror' in <stdlib.h>, not in <stdio.h>. We must include |
|
it before we #define perror rpl_perror. */ |
|
/* But in any case avoid namespace pollution on glibc systems. */ |
|
#if (@GNULIB_PERROR@ || defined GNULIB_POSIXCHECK) \ |
|
&& (defined _WIN32 && ! defined __CYGWIN__) \ |
|
&& ! defined __GLIBC__ |
|
# include <stdlib.h> |
|
#endif |
|
|
|
/* MSVC declares 'remove' in <io.h>, not in <stdio.h>. We must include |
|
it before we #define remove rpl_remove. */ |
|
/* MSVC declares 'rename' in <io.h>, not in <stdio.h>. We must include |
|
it before we #define rename rpl_rename. */ |
|
/* But in any case avoid namespace pollution on glibc systems. */ |
|
#if (@GNULIB_REMOVE@ || @GNULIB_RENAME@ || defined GNULIB_POSIXCHECK) \ |
|
&& (defined _WIN32 && ! defined __CYGWIN__) \ |
|
&& ! defined __GLIBC__ |
|
# include <io.h> |
|
#endif |
|
|
|
|
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ |
|
|
/* The definition of _GL_ARG_NONNULL is copied here. */ |
/* The definition of _GL_ARG_NONNULL is copied here. */ |
Line 124
|
Line 156
|
#define _GL_STDIO_STRINGIZE(token) #token |
#define _GL_STDIO_STRINGIZE(token) #token |
#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token) |
#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token) |
|
|
|
/* When also using extern inline, suppress the use of static inline in |
|
standard headers of problematic Apple configurations, as Libc at |
|
least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., |
|
<https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>. |
|
Perhaps Apple will fix this some day. */ |
|
#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \ |
|
&& defined __GNUC__ && defined __STDC__) |
|
# undef putc_unlocked |
|
#endif |
|
|
#if @GNULIB_DPRINTF@ |
#if @GNULIB_DPRINTF@ |
# if @REPLACE_DPRINTF@ |
# if @REPLACE_DPRINTF@ |
Line 170 _GL_WARN_ON_USE (fclose, "fclose is not always POSIX c
|
Line 211 _GL_WARN_ON_USE (fclose, "fclose is not always POSIX c
|
"use gnulib module fclose for portable POSIX compliance"); |
"use gnulib module fclose for portable POSIX compliance"); |
#endif |
#endif |
|
|
|
#if @GNULIB_FDOPEN@ |
|
# if @REPLACE_FDOPEN@ |
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
|
# undef fdopen |
|
# define fdopen rpl_fdopen |
|
# endif |
|
_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode) |
|
_GL_ARG_NONNULL ((2))); |
|
_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode)); |
|
# else |
|
_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode)); |
|
# endif |
|
_GL_CXXALIASWARN (fdopen); |
|
#elif defined GNULIB_POSIXCHECK |
|
# undef fdopen |
|
/* Assume fdopen is always declared. */ |
|
_GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - " |
|
"use gnulib module fdopen for portability"); |
|
#endif |
|
|
#if @GNULIB_FFLUSH@ |
#if @GNULIB_FFLUSH@ |
/* Flush all pending data on STREAM according to POSIX rules. Both |
/* Flush all pending data on STREAM according to POSIX rules. Both |
output and seekable input streams are supported. |
output and seekable input streams are supported. |
Line 239 _GL_CXXALIASWARN (fopen);
|
Line 300 _GL_CXXALIASWARN (fopen);
|
#elif defined GNULIB_POSIXCHECK |
#elif defined GNULIB_POSIXCHECK |
# undef fopen |
# undef fopen |
/* Assume fopen is always declared. */ |
/* Assume fopen is always declared. */ |
_GL_WARN_ON_USE (fopen, "fopen on Win32 platforms is not POSIX compatible - " | _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - " |
"use gnulib module fopen for portability"); |
"use gnulib module fopen for portability"); |
#endif |
#endif |
|
|
Line 367 _GL_CXXALIASWARN (freopen);
|
Line 428 _GL_CXXALIASWARN (freopen);
|
# undef freopen |
# undef freopen |
/* Assume freopen is always declared. */ |
/* Assume freopen is always declared. */ |
_GL_WARN_ON_USE (freopen, |
_GL_WARN_ON_USE (freopen, |
"freopen on Win32 platforms is not POSIX compatible - " | "freopen on native Windows platforms is not POSIX compliant - " |
"use gnulib module freopen for portability"); |
"use gnulib module freopen for portability"); |
#endif |
#endif |
|
|
Line 555 _GL_CXXALIAS_RPL (fwrite, size_t,
|
Line 616 _GL_CXXALIAS_RPL (fwrite, size_t,
|
_GL_CXXALIAS_SYS (fwrite, size_t, |
_GL_CXXALIAS_SYS (fwrite, size_t, |
(const void *ptr, size_t s, size_t n, FILE *stream)); |
(const void *ptr, size_t s, size_t n, FILE *stream)); |
|
|
/* Work around glibc bug 11959 | /* Work around bug 11959 when fortifying glibc 2.4 through 2.15 |
<http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>, | <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>, |
which sometimes causes an unwanted diagnostic for fwrite calls. |
which sometimes causes an unwanted diagnostic for fwrite calls. |
This affects only function declaration attributes, so it's not | This affects only function declaration attributes under certain |
needed for C++. */ | versions of gcc and clang, and is not needed for C++. */ |
# if !defined __cplusplus && 0 < __USE_FORTIFY_LEVEL | # if (0 < __USE_FORTIFY_LEVEL \ |
static inline size_t _GL_ARG_NONNULL ((1, 4)) | && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \ |
rpl_fwrite (const void *ptr, size_t s, size_t n, FILE *stream) | && 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \ |
{ | && !defined __cplusplus) |
size_t r = fwrite (ptr, s, n, stream); | |
(void) r; | |
return r; | |
} | |
# undef fwrite |
# undef fwrite |
|
# undef fwrite_unlocked |
|
extern size_t __REDIRECT (rpl_fwrite, |
|
(const void *__restrict, size_t, size_t, |
|
FILE *__restrict), |
|
fwrite); |
|
extern size_t __REDIRECT (rpl_fwrite_unlocked, |
|
(const void *__restrict, size_t, size_t, |
|
FILE *__restrict), |
|
fwrite_unlocked); |
# define fwrite rpl_fwrite |
# define fwrite rpl_fwrite |
|
# define fwrite_unlocked rpl_fwrite_unlocked |
# endif |
# endif |
# endif |
# endif |
_GL_CXXALIASWARN (fwrite); |
_GL_CXXALIASWARN (fwrite); |
Line 679 _GL_WARN_ON_USE (getline, "getline is unportable - "
|
Line 746 _GL_WARN_ON_USE (getline, "getline is unportable - "
|
# endif |
# endif |
#endif |
#endif |
|
|
#if @GNULIB_GETS@ |
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@ |
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE) |
|
# undef gets |
|
# define gets rpl_gets |
|
# endif |
|
_GL_FUNCDECL_RPL (gets, char *, (char *s) _GL_ARG_NONNULL ((1))); |
|
_GL_CXXALIAS_RPL (gets, char *, (char *s)); |
|
# else |
|
_GL_CXXALIAS_SYS (gets, char *, (char *s)); |
|
# undef gets |
|
# endif |
|
_GL_CXXALIASWARN (gets); |
|
/* It is very rare that the developer ever has full control of stdin, |
/* It is very rare that the developer ever has full control of stdin, |
so any use of gets warrants an unconditional warning. Assume it is | so any use of gets warrants an unconditional warning; besides, C11 |
always declared, since it is required by C89. */ | removed it. */ |
| #undef gets |
| #if HAVE_RAW_DECL_GETS && !defined __cplusplus |
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); |
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); |
#endif |
#endif |
|
|
|
|
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@ |
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@ |
struct obstack; |
struct obstack; |
/* Grow an obstack with formatted output. Return the number of |
/* Grow an obstack with formatted output. Return the number of |
Line 750 _GL_CXXALIAS_SYS (obstack_vprintf, int,
|
Line 805 _GL_CXXALIAS_SYS (obstack_vprintf, int,
|
_GL_CXXALIASWARN (obstack_vprintf); |
_GL_CXXALIASWARN (obstack_vprintf); |
#endif |
#endif |
|
|
|
#if @GNULIB_PCLOSE@ |
|
# if !@HAVE_PCLOSE@ |
|
_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1))); |
|
# endif |
|
_GL_CXXALIAS_SYS (pclose, int, (FILE *stream)); |
|
_GL_CXXALIASWARN (pclose); |
|
#elif defined GNULIB_POSIXCHECK |
|
# undef pclose |
|
# if HAVE_RAW_DECL_PCLOSE |
|
_GL_WARN_ON_USE (pclose, "pclose is unportable - " |
|
"use gnulib module pclose for more portability"); |
|
# endif |
|
#endif |
|
|
#if @GNULIB_PERROR@ |
#if @GNULIB_PERROR@ |
/* Print a message to standard error, describing the value of ERRNO, |
/* Print a message to standard error, describing the value of ERRNO, |
(if STRING is not NULL and not empty) prefixed with STRING and ": ", |
(if STRING is not NULL and not empty) prefixed with STRING and ": ", |
Line 781 _GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, con
|
Line 850 _GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, con
|
_GL_ARG_NONNULL ((1, 2))); |
_GL_ARG_NONNULL ((1, 2))); |
_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode)); |
_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode)); |
# else |
# else |
|
# if !@HAVE_POPEN@ |
|
_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode) |
|
_GL_ARG_NONNULL ((1, 2))); |
|
# endif |
_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode)); |
_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode)); |
# endif |
# endif |
_GL_CXXALIASWARN (popen); |
_GL_CXXALIASWARN (popen); |
Line 1016 _GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
|
Line 1089 _GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
|
# endif |
# endif |
#endif |
#endif |
|
|
/* Some people would argue that sprintf should be handled like gets | /* Some people would argue that all sprintf uses should be warned about |
(for example, OpenBSD issues a link warning for both functions), | (for example, OpenBSD issues a link warning for it), |
since both can cause security holes due to buffer overruns. | since it can cause security holes due to buffer overruns. |
However, we believe that sprintf can be used safely, and is more |
However, we believe that sprintf can be used safely, and is more |
efficient than snprintf in those safe cases; and as proof of our |
efficient than snprintf in those safe cases; and as proof of our |
belief, we use sprintf in several gnulib modules. So this header |
belief, we use sprintf in several gnulib modules. So this header |
Line 1305 _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POS
|
Line 1378 _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POS
|
"use gnulib module vsprintf-posix for portable " |
"use gnulib module vsprintf-posix for portable " |
"POSIX compliance"); |
"POSIX compliance"); |
#endif |
#endif |
|
|
|
|
#endif /* _@GUARD_PREFIX@_STDIO_H */ |
#endif /* _@GUARD_PREFIX@_STDIO_H */ |
#endif /* _@GUARD_PREFIX@_STDIO_H */ |
#endif /* _@GUARD_PREFIX@_STDIO_H */ |