105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* A more-standard <time.h>.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2007-2012 Free Software Foundation, Inc.
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software; you can redistribute it and/or modify
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3, or (at your option)
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   any later version.
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ >= 3
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang@PRAGMA_SYSTEM_HEADER@
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang@PRAGMA_COLUMNS@
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Don't get in the way of glibc when it includes time.h merely to
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declare a few standard symbols, rather than to declare all the
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   symbols.  Also, Solaris 8 <time.h> eventually includes itself
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   recursively; if that is happening, just include the system <time.h>
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   without adding our own declarations.  */
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if (defined __need_time_t || defined __need_clock_t \
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     || defined __need_timespec \
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     || defined _@GUARD_PREFIX@_TIME_H)
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# @INCLUDE_NEXT@ @NEXT_TIME_H@
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _@GUARD_PREFIX@_TIME_H
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# @INCLUDE_NEXT@ @NEXT_TIME_H@
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* NetBSD 5.0 mis-defines NULL.  */
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <stddef.h>
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definition of _GL_ARG_NONNULL is copied here.  */
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definition of _GL_WARN_ON_USE is copied here.  */
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3).
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Or they define it with the wrong member names or define it in <sys/time.h>
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (e.g., FreeBSD circa 1997).  Stock Mingw does not define it, but the
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   pthreads-win32 library defines it in <pthread.h>.  */
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   include <sys/time.h>
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   include <pthread.h>
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The pthreads-win32 <pthread.h> also defines a couple of broken macros.  */
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef asctime_r
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef ctime_r
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef gmtime_r
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef localtime_r
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef rand_r
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strtok_r
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  else
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   ifdef __cplusplus
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern "C" {
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if !GNULIB_defined_struct_timespec
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    undef timespec
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define timespec rpl_timespec
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct timespec
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  time_t tv_sec;
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  long int tv_nsec;
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define GNULIB_defined_struct_timespec 1
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   ifdef __cplusplus
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !GNULIB_defined_struct_time_t_must_be_integral
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Per http://austingroupbugs.net/view.php?id=327, POSIX requires
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   time_t to be an integer type, even though C99 permits floating
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   point.  We don't know of any implementation that uses floating
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   point, and it is much easier to write code that doesn't have to
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   worry about that corner case, so we force the issue.  */
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct __time_t_must_be_integral {
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  unsigned int __floating_time_t_unsupported : (time_t) 1;
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define GNULIB_defined_struct_time_t_must_be_integral 1
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   return -1 and store the remaining time into RMTP.  See
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://www.opengroup.org/susv3xsh/nanosleep.html>.  */
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @GNULIB_NANOSLEEP@
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @REPLACE_NANOSLEEP@
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define nanosleep rpl_nanosleep
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (nanosleep, int,
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (struct timespec const *__rqtp, struct timespec *__rmtp)
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1)));
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (nanosleep, int,
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (struct timespec const *__rqtp, struct timespec *__rmtp));
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  else
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if ! @HAVE_NANOSLEEP@
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (nanosleep, int,
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (struct timespec const *__rqtp, struct timespec *__rmtp)
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1)));
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (nanosleep, int,
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (struct timespec const *__rqtp, struct timespec *__rmtp));
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (nanosleep);
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return the 'time_t' representation of TP and normalize TP.  */
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @GNULIB_MKTIME@
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @REPLACE_MKTIME@
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define mktime rpl_mktime
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1)));
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp));
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  else
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp));
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (mktime);
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Convert TIMER to RESULT, assuming local time and UTC respectively.  See
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://www.opengroup.org/susv3xsh/localtime_r.html> and
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://www.opengroup.org/susv3xsh/gmtime_r.html>.  */
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @GNULIB_TIME_R@
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @REPLACE_LOCALTIME_R@
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    undef localtime_r
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define localtime_r rpl_localtime_r
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                             struct tm *restrict __result)
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                            _GL_ARG_NONNULL ((1, 2)));
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                             struct tm *restrict __result));
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  else
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if ! @HAVE_DECL_LOCALTIME_R@
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                             struct tm *restrict __result)
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                            _GL_ARG_NONNULL ((1, 2)));
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                             struct tm *restrict __result));
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @HAVE_DECL_LOCALTIME_R@
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (localtime_r);
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @REPLACE_LOCALTIME_R@
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    undef gmtime_r
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define gmtime_r rpl_gmtime_r
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          struct tm *restrict __result)
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                         _GL_ARG_NONNULL ((1, 2)));
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          struct tm *restrict __result));
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  else
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if ! @HAVE_DECL_LOCALTIME_R@
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          struct tm *restrict __result)
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                         _GL_ARG_NONNULL ((1, 2)));
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                          struct tm *restrict __result));
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @HAVE_DECL_LOCALTIME_R@
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (gmtime_r);
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the resulting broken-down time into TM.  See
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <http://www.opengroup.org/susv3xsh/strptime.html>.  */
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @GNULIB_STRPTIME@
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_STRPTIME@
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf,
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     char const *restrict __format,
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     struct tm *restrict __tm)
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    _GL_ARG_NONNULL ((1, 2, 3)));
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf,
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     char const *restrict __format,
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     struct tm *restrict __tm));
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strptime);
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Convert TM to a time_t value, assuming UTC.  */
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @GNULIB_TIMEGM@
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @REPLACE_TIMEGM@
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    undef timegm
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#    define timegm rpl_timegm
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm));
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  else
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   if ! @HAVE_TIMEGM@
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   endif
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm));
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (timegm);
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Encourage applications to avoid unsafe functions that can overrun
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   buffers when given outlandish struct tm values.  Portable
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   applications should use strftime (or even sprintf) instead.  */
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef asctime
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - "
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "better use strftime (or even sprintf) instead");
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef asctime_r
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "better use strftime (or even sprintf) instead");
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef ctime
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "better use strftime (or even sprintf) instead");
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef ctime_r
24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "better use strftime (or even sprintf) instead");
24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
249