AC_DEFUN([gl_FUNC_GETTIMEOFDAY],
[
AC_REQUIRE([AC_C_RESTRICT])
AC_REQUIRE([gl_HEADER_SYS_TIME_H])
AC_CHECK_FUNCS_ONCE([gettimeofday])
AC_CACHE_CHECK([for gettimeofday with POSIX signature],
[gl_cv_func_gettimeofday_posix_signature],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[ struct timeval c;
]],
[[
int (*f) (struct timeval *restrict, void *restrict) = gettimeofday;
int x = f (&c, 0);
return !(x | c.tv_sec | c.tv_usec);
]])],
[gl_cv_func_gettimeofday_posix_signature=yes],
[gl_cv_func_gettimeofday_posix_signature=no])])
gl_FUNC_GETTIMEOFDAY_CLOBBER
if test $gl_cv_func_gettimeofday_posix_signature != yes; then
REPLACE_GETTIMEOFDAY=1
SYS_TIME_H=sys/time.h
if test $gl_cv_func_gettimeofday_clobber != yes; then
AC_LIBOBJ(gettimeofday)
gl_PREREQ_GETTIMEOFDAY
fi
fi
])
AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
[
AC_REQUIRE([gl_HEADER_SYS_TIME_H])
AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
[gl_cv_func_gettimeofday_clobber],
[AC_RUN_IFELSE(
[AC_LANG_PROGRAM(
[[ ]],
[[
time_t t = 0;
struct tm *lt;
struct tm saved_lt;
struct timeval tv;
lt = localtime (&t);
saved_lt = *lt;
gettimeofday (&tv, NULL);
return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
]])],
[gl_cv_func_gettimeofday_clobber=no],
[gl_cv_func_gettimeofday_clobber=yes],
[gl_cv_func_gettimeofday_clobber=yes])])
if test $gl_cv_func_gettimeofday_clobber = yes; then
REPLACE_GETTIMEOFDAY=1
SYS_TIME_H=sys/time.h
gl_GETTIMEOFDAY_REPLACE_LOCALTIME
AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], 1,
[Define if gettimeofday clobbers the localtime buffer.])
fi
])
AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
AC_LIBOBJ(gettimeofday)
gl_PREREQ_GETTIMEOFDAY
AC_DEFINE([gmtime], [rpl_gmtime],
[Define to rpl_gmtime if the replacement function should be used.])
AC_DEFINE([localtime], [rpl_localtime],
[Define to rpl_localtime if the replacement function should be used.])
])
AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [
AC_CHECK_HEADERS([sys/timeb.h])
AC_CHECK_FUNCS([_ftime])
])