Blame m4/gettimeofday.m4

Packit 1ef1a9
# serial 21
Packit 1ef1a9
Packit 1ef1a9
# Copyright (C) 2001-2003, 2005, 2007, 2009-2015 Free Software Foundation, Inc.
Packit 1ef1a9
# This file is free software; the Free Software Foundation
Packit 1ef1a9
# gives unlimited permission to copy and/or distribute it,
Packit 1ef1a9
# with or without modifications, as long as this notice is preserved.
Packit 1ef1a9
Packit 1ef1a9
dnl From Jim Meyering.
Packit 1ef1a9
Packit 1ef1a9
AC_DEFUN([gl_FUNC_GETTIMEOFDAY],
Packit 1ef1a9
[
Packit 1ef1a9
  AC_REQUIRE([AC_C_RESTRICT])
Packit 1ef1a9
  AC_REQUIRE([gl_HEADER_SYS_TIME_H])
Packit 1ef1a9
  AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
Packit 1ef1a9
  AC_CHECK_FUNCS_ONCE([gettimeofday])
Packit 1ef1a9
Packit 1ef1a9
  gl_gettimeofday_timezone=void
Packit 1ef1a9
  if test $ac_cv_func_gettimeofday != yes; then
Packit 1ef1a9
    HAVE_GETTIMEOFDAY=0
Packit 1ef1a9
  else
Packit 1ef1a9
    gl_FUNC_GETTIMEOFDAY_CLOBBER
Packit 1ef1a9
    AC_CACHE_CHECK([for gettimeofday with POSIX signature],
Packit 1ef1a9
      [gl_cv_func_gettimeofday_posix_signature],
Packit 1ef1a9
      [AC_COMPILE_IFELSE(
Packit 1ef1a9
         [AC_LANG_PROGRAM(
Packit 1ef1a9
            [[#include <sys/time.h>
Packit 1ef1a9
              struct timeval c;
Packit 1ef1a9
              int gettimeofday (struct timeval *restrict, void *restrict);
Packit 1ef1a9
            ]],
Packit 1ef1a9
            [[/* glibc uses struct timezone * rather than the POSIX void *
Packit 1ef1a9
                 if _GNU_SOURCE is defined.  However, since the only portable
Packit 1ef1a9
                 use of gettimeofday uses NULL as the second parameter, and
Packit 1ef1a9
                 since the glibc definition is actually more typesafe, it is
Packit 1ef1a9
                 not worth wrapping this to get a compliant signature.  */
Packit 1ef1a9
              int (*f) (struct timeval *restrict, void *restrict)
Packit 1ef1a9
                = gettimeofday;
Packit 1ef1a9
              int x = f (&c, 0);
Packit 1ef1a9
              return !(x | c.tv_sec | c.tv_usec);
Packit 1ef1a9
            ]])],
Packit 1ef1a9
          [gl_cv_func_gettimeofday_posix_signature=yes],
Packit 1ef1a9
          [AC_COMPILE_IFELSE(
Packit 1ef1a9
            [AC_LANG_PROGRAM(
Packit 1ef1a9
              [[#include <sys/time.h>
Packit 1ef1a9
int gettimeofday (struct timeval *restrict, struct timezone *restrict);
Packit 1ef1a9
              ]])],
Packit 1ef1a9
            [gl_cv_func_gettimeofday_posix_signature=almost],
Packit 1ef1a9
            [gl_cv_func_gettimeofday_posix_signature=no])])])
Packit 1ef1a9
    if test $gl_cv_func_gettimeofday_posix_signature = almost; then
Packit 1ef1a9
      gl_gettimeofday_timezone='struct timezone'
Packit 1ef1a9
    elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
Packit 1ef1a9
      REPLACE_GETTIMEOFDAY=1
Packit 1ef1a9
    fi
Packit 1ef1a9
    dnl If we override 'struct timeval', we also have to override gettimeofday.
Packit 1ef1a9
    if test $REPLACE_STRUCT_TIMEVAL = 1; then
Packit 1ef1a9
      REPLACE_GETTIMEOFDAY=1
Packit 1ef1a9
    fi
Packit 1ef1a9
    m4_ifdef([gl_FUNC_TZSET_CLOBBER], [
Packit 1ef1a9
      gl_FUNC_TZSET_CLOBBER
Packit 1ef1a9
      case "$gl_cv_func_tzset_clobber" in
Packit 1ef1a9
        *yes)
Packit 1ef1a9
          REPLACE_GETTIMEOFDAY=1
Packit 1ef1a9
          gl_GETTIMEOFDAY_REPLACE_LOCALTIME
Packit 1ef1a9
          AC_DEFINE([tzset], [rpl_tzset],
Packit 1ef1a9
            [Define to rpl_tzset if the wrapper function should be used.])
Packit 1ef1a9
          AC_DEFINE([TZSET_CLOBBERS_LOCALTIME], [1],
Packit 1ef1a9
            [Define if tzset clobbers localtime's static buffer.])
Packit 1ef1a9
          ;;
Packit 1ef1a9
      esac
Packit 1ef1a9
    ])
Packit 1ef1a9
  fi
Packit 1ef1a9
  AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone],
Packit 1ef1a9
    [Define this to 'void' or 'struct timezone' to match the system's
Packit 1ef1a9
     declaration of the second argument to gettimeofday.])
Packit 1ef1a9
])
Packit 1ef1a9
Packit 1ef1a9
Packit 1ef1a9
dnl See if gettimeofday clobbers the static buffer that localtime uses
Packit 1ef1a9
dnl for its return value.  The gettimeofday function from Mac OS X 10.0.4
Packit 1ef1a9
dnl (i.e., Darwin 1.3.7) has this problem.
Packit 1ef1a9
dnl
Packit 1ef1a9
dnl If it does, then arrange to use gettimeofday and localtime only via
Packit 1ef1a9
dnl the wrapper functions that work around the problem.
Packit 1ef1a9
Packit 1ef1a9
AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
Packit 1ef1a9
[
Packit 1ef1a9
 AC_REQUIRE([gl_HEADER_SYS_TIME_H])
Packit 1ef1a9
 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit 1ef1a9
Packit 1ef1a9
 AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
Packit 1ef1a9
  [gl_cv_func_gettimeofday_clobber],
Packit 1ef1a9
  [AC_RUN_IFELSE(
Packit 1ef1a9
     [AC_LANG_PROGRAM(
Packit 1ef1a9
        [[#include <string.h>
Packit 1ef1a9
          #include <sys/time.h>
Packit 1ef1a9
          #include <time.h>
Packit 1ef1a9
          #include <stdlib.h>
Packit 1ef1a9
        ]],
Packit 1ef1a9
        [[
Packit 1ef1a9
          time_t t = 0;
Packit 1ef1a9
          struct tm *lt;
Packit 1ef1a9
          struct tm saved_lt;
Packit 1ef1a9
          struct timeval tv;
Packit 1ef1a9
          lt = localtime (&t);
Packit 1ef1a9
          saved_lt = *lt;
Packit 1ef1a9
          gettimeofday (&tv, NULL);
Packit 1ef1a9
          return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
Packit 1ef1a9
        ]])],
Packit 1ef1a9
     [gl_cv_func_gettimeofday_clobber=no],
Packit 1ef1a9
     [gl_cv_func_gettimeofday_clobber=yes],
Packit 1ef1a9
     [# When cross-compiling:
Packit 1ef1a9
      case "$host_os" in
Packit 1ef1a9
                # Guess all is fine on glibc systems.
Packit 1ef1a9
        *-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;;
Packit 1ef1a9
                # If we don't know, assume the worst.
Packit 1ef1a9
        *)      gl_cv_func_gettimeofday_clobber="guessing yes" ;;
Packit 1ef1a9
      esac
Packit 1ef1a9
     ])])
Packit 1ef1a9
Packit 1ef1a9
 case "$gl_cv_func_gettimeofday_clobber" in
Packit 1ef1a9
   *yes)
Packit 1ef1a9
     REPLACE_GETTIMEOFDAY=1
Packit 1ef1a9
     gl_GETTIMEOFDAY_REPLACE_LOCALTIME
Packit 1ef1a9
     AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1],
Packit 1ef1a9
       [Define if gettimeofday clobbers the localtime buffer.])
Packit 1ef1a9
     ;;
Packit 1ef1a9
 esac
Packit 1ef1a9
])
Packit 1ef1a9
Packit 1ef1a9
AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [
Packit 1ef1a9
  REPLACE_GMTIME=1
Packit 1ef1a9
  REPLACE_LOCALTIME=1
Packit 1ef1a9
])
Packit 1ef1a9
Packit 1ef1a9
# Prerequisites of lib/gettimeofday.c.
Packit 1ef1a9
AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [
Packit 1ef1a9
  AC_CHECK_HEADERS([sys/timeb.h])
Packit 1ef1a9
  AC_CHECK_FUNCS([_ftime])
Packit 1ef1a9
])