changeset 7897:b7a83a69ac23

* MODULES.html.sh (Support for systems lacking POSIX:2001): New module sys_time. * lib/gethrxtime.c: Include <sys/time.h>, since we can no longer assume timespec.h defines struct timeval. * lib/settime.c: Likewise. * lib/utimens.c: Likewise. * lib/gettime.c (gettime): Remove test against HAVE_GETTIMEOFDAY, since we now assume the gettimeofday module. * lib/tempname.c (__gen_tempname): Likewise. * lib/gettimeofday.h: Remove. * lib/gettimeofday.c: Include <sys/time.h> instead of "gettimeofday.h". Don't include <sys/types.h> and <stdlib.h>; shouldn't be needed. Include <time.h>, for 'time()'. (localtime_buffer_addr): Also use this workaround if TZSET_CLOBBERS_LOCALTIME. Set to a dummy static variable by default, to simplify the uses. All uses changed. (localtime, gmtime, tzset, gettimeofday): Reformat slightly so that #undef is inside {}, and 'const' follows type name consistently. (tzset): Define replacement only if TZSET_CLOBBERS_LOCALTIME. (gettimeofday): Do not use the maximum possible value for tv->tv_usec, since that might break usages other than ls.c. Instead, we'll leave ls.c alone. This undoes today's patch by Bruno. Add a compile-time warning for 1s-clock resolution; we've never observed the problem but might as well keep the canary. * lib/nanosleep.c: Include timespec.h first, for interface check. * lib/nanosleep.c: Include <sys/time.h> unconditionally, since we now assume the sys_time module. * lib/tempname.c: Likewise. * lib/timespec.h: Likewise. * lib/nanosleep.c: Don't worry about TIME_WITH_SYS_TIME; no longer needed. * lib/strftime.c: Likewise. * lib/timespec.h: Likewise. * lib/posixtm.c: Include posixtm.h first, for interface check. Don't worry about TM_IN_SYS_TIME; that's wayyy obsolete. * lib/posixtm.h: Include stdbool.h and time.h, for proper interface. * lib/strftime.c: Don't include <sys/types.h>; shouldn't be needed. * lib/sys_time_.h: New file. * lib/timespec.h (struct timespec): Use long int, not long. * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): (gl_FUNC_GETTIMEOFDAY_CLOBBER, gl_PREREQ_GETTIMEOFDAY): Remove obsolescent call to AC_HEADER_TIME. * m4/mktime.m4 (AC_FUNC_MKTIME): Likewise. * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise. * m4/strftime.m4 (gl_FUNC_STRFTIME): Likewise. * m4/timespec.m4 (gl_TIMESPEC, gl_CHECK_TYPE_STRUCT_TIMESPEC): Likewise. * m4/tzset.m4 (gl_FUNC_TZSET_CLOBBER): Likewise. * m4/utimbuf.m4 (gl_CHECK_TYPE_STRUCT_UTIMBUF): Likewise. * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Move sys/time.h tests into the sys_time module. Check for gettimeofday just once. Prefix our variables with gl_, not with ac_ or jm_. Tighten test for gettimeofday signature to just check the signature. Merely compile it, since linking doesn't test signature. Improve test for whether gettimeofday.o is actually needed. (gl_FUNC_GETTIMEOFDAY_CLOBBER): Renamed from AC_FUNC_GETTIMEOFDAY_CLOBBER. All uses changed. Use AC_RUN_IFELSE rather than AC_TRY_RUN. If clobbering, set and define GETTIMEOFDAY_CLOBBERS_LOCALTIME. (gl_GETTIMEOFDAY_REPLACE_LOCALTIME): Don't define GETTIMEOFDAY_CLOBBERS_LOCALTIME; that's gl_FUNC_GETTIMEOFDAY_CLOBBER's job. Don't define tzset; that's gl_FUNC_TZSET_CLOBBER's job. * m4/mktime.m4 (AC_FUNC_MKTIME): Just include <time.h> rather than worrying about sys/time.h. * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Don't bother worrying about TIME_WITH_SYS_TIME. * m4/stat-time.m4 (gl_STAT_TIME): Likewise. * m4/posixtm.m4 (gl_POSIXTM): Remove obsolescent call to AC_STRUCT_TM. * m4/sys_time_h.m4: New file. * m4/tzset.m4 (gl_FUNC_TZSET_CLOBBER): Require gl_HEADER_SYS_TIME_H. Don't include sys/time.h. Return from main rather than exiting. Define TZSET_CLOBBERS_LOCALTIME, for consistency with other names; all uses changed. * modules/gethrxtime (Depends-on): Add sys_time. * modules/gettime (Depends-on): Likewise. * modules/gettimeofday (Depends-on): Likewise. * modules/nanosleep (Depends-on): Likewise. * modules/settime (Depends-on): Likewise. * modules/tempname (Depends-on): Likewise. * modules/utimens (Depends-on): Likewise. * modules/gettimeofday (Files): Remove lib/gettimeofday.h. (Include:) Change back to <sys/time.h>. (Maintainer:) Add self. * modules/sys_time: New file. * modules/tempname (Depends-on): Add gettimeofday. * tests/test-gettimeofday.c: Include <sys/time.h> rather than gettimeofday.h.
author Paul Eggert <eggert@cs.ucla.edu>
date Thu, 18 Jan 2007 08:33:34 +0000
parents cd3ed2fae0bf
children 9a1885fa7afb
files ChangeLog MODULES.html.sh lib/gethrxtime.c lib/gettime.c lib/gettimeofday.c lib/gettimeofday.h lib/nanosleep.c lib/posixtm.c lib/posixtm.h lib/settime.c lib/strftime.c lib/sys_time_.h lib/tempname.c lib/timespec.h lib/utimens.c m4/gettimeofday.m4 m4/mktime.m4 m4/nanosleep.m4 m4/posixtm.m4 m4/stat-time.m4 m4/strftime.m4 m4/sys_time_h.m4 m4/timespec.m4 m4/tzset.m4 m4/utimbuf.m4 modules/gethrxtime modules/gettime modules/gettimeofday modules/nanosleep modules/settime modules/sys_time modules/tempname modules/utimens tests/test-gettimeofday.c
diffstat 34 files changed, 439 insertions(+), 434 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,94 @@
+2007-01-17  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* MODULES.html.sh (Support for systems lacking POSIX:2001): New
+	module sys_time.
+	* lib/gethrxtime.c: Include <sys/time.h>, since we can no longer
+	assume timespec.h defines struct timeval.
+	* lib/settime.c: Likewise.
+	* lib/utimens.c: Likewise.
+	* lib/gettime.c (gettime): Remove test against HAVE_GETTIMEOFDAY,
+	since we now assume the gettimeofday module.
+	* lib/tempname.c (__gen_tempname): Likewise.
+	* lib/gettimeofday.h: Remove.
+	* lib/gettimeofday.c: Include <sys/time.h> instead of "gettimeofday.h".
+	Don't include <sys/types.h> and <stdlib.h>; shouldn't be needed.
+	Include <time.h>, for 'time()'.
+	(localtime_buffer_addr): Also use this workaround if
+	TZSET_CLOBBERS_LOCALTIME.  Set to a dummy static variable by default,
+	to simplify the uses.  All uses changed.
+	(localtime, gmtime, tzset, gettimeofday): Reformat slightly so
+	that #undef is inside {}, and 'const' follows type name consistently.
+	(tzset): Define replacement only if TZSET_CLOBBERS_LOCALTIME.
+	(gettimeofday): Do not use the maximum possible value for
+	tv->tv_usec, since that might break usages other than ls.c.
+	Instead, we'll leave ls.c alone.  This undoes today's patch
+	by Bruno.  Add a compile-time warning for 1s-clock resolution;
+	we've never observed the problem but might as well keep the
+	canary.
+	* lib/nanosleep.c: Include timespec.h first, for interface check.
+	* lib/nanosleep.c: Include <sys/time.h> unconditionally, since we
+	now assume the sys_time module.
+	* lib/tempname.c: Likewise.
+	* lib/timespec.h: Likewise.
+	* lib/nanosleep.c: Don't worry about TIME_WITH_SYS_TIME; no longer
+	needed.
+	* lib/strftime.c: Likewise.
+	* lib/timespec.h: Likewise.
+	* lib/posixtm.c: Include posixtm.h first, for interface check.
+	Don't worry about TM_IN_SYS_TIME; that's wayyy obsolete.
+	* lib/posixtm.h: Include stdbool.h and time.h, for proper interface.
+	* lib/strftime.c: Don't include <sys/types.h>; shouldn't be needed.
+	* lib/sys_time_.h: New file.
+	* lib/timespec.h (struct timespec): Use long int, not long.
+	* m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY):
+	(gl_FUNC_GETTIMEOFDAY_CLOBBER, gl_PREREQ_GETTIMEOFDAY):
+	Remove obsolescent call to AC_HEADER_TIME.
+	* m4/mktime.m4 (AC_FUNC_MKTIME): Likewise.
+	* m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Likewise.
+	* m4/strftime.m4 (gl_FUNC_STRFTIME): Likewise.
+	* m4/timespec.m4 (gl_TIMESPEC, gl_CHECK_TYPE_STRUCT_TIMESPEC):
+	Likewise.
+	* m4/tzset.m4 (gl_FUNC_TZSET_CLOBBER): Likewise.
+	* m4/utimbuf.m4 (gl_CHECK_TYPE_STRUCT_UTIMBUF): Likewise.
+	* m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Move sys/time.h tests
+	into the sys_time module.  Check for gettimeofday just once.
+	Prefix our variables with gl_, not with ac_ or jm_.  Tighten test
+	for gettimeofday signature to just check the signature.  Merely
+	compile it, since linking doesn't test signature.  Improve test for
+	whether gettimeofday.o is actually needed.
+	(gl_FUNC_GETTIMEOFDAY_CLOBBER): Renamed from
+	AC_FUNC_GETTIMEOFDAY_CLOBBER.  All uses changed.  Use
+	AC_RUN_IFELSE rather than AC_TRY_RUN.  If clobbering, set
+	and define GETTIMEOFDAY_CLOBBERS_LOCALTIME.
+	(gl_GETTIMEOFDAY_REPLACE_LOCALTIME): Don't define
+	GETTIMEOFDAY_CLOBBERS_LOCALTIME; that's gl_FUNC_GETTIMEOFDAY_CLOBBER's
+	job.  Don't define tzset; that's gl_FUNC_TZSET_CLOBBER's job.
+	* m4/mktime.m4 (AC_FUNC_MKTIME): Just include <time.h> rather
+	than worrying about sys/time.h.
+	* m4/nanosleep.m4 (gl_FUNC_NANOSLEEP):
+	Don't bother worrying about TIME_WITH_SYS_TIME.
+	* m4/stat-time.m4 (gl_STAT_TIME): Likewise.
+	* m4/posixtm.m4 (gl_POSIXTM): Remove obsolescent call to AC_STRUCT_TM.
+	* m4/sys_time_h.m4: New file.
+	* m4/tzset.m4 (gl_FUNC_TZSET_CLOBBER): Require gl_HEADER_SYS_TIME_H.
+	Don't include sys/time.h.  Return from main rather than exiting.
+	Define TZSET_CLOBBERS_LOCALTIME, for consistency with other names;
+	all uses changed.
+	* modules/gethrxtime (Depends-on): Add sys_time.
+	* modules/gettime (Depends-on): Likewise.
+	* modules/gettimeofday (Depends-on): Likewise.
+	* modules/nanosleep (Depends-on): Likewise.
+	* modules/settime (Depends-on): Likewise.
+	* modules/tempname (Depends-on): Likewise.
+	* modules/utimens (Depends-on): Likewise.
+	* modules/gettimeofday (Files): Remove lib/gettimeofday.h.
+	(Include:) Change back to <sys/time.h>.
+	(Maintainer:) Add self.
+	* modules/sys_time: New file.
+	* modules/tempname (Depends-on): Add gettimeofday.
+	* tests/test-gettimeofday.c: Include <sys/time.h>
+	rather than gettimeofday.h.
+
 2007-01-17  Bruno Haible  <bruno@clisp.org>
 
 	* gnulib-tool (func_get_license): Revert last patch. Instead, let
--- a/MODULES.html.sh
+++ b/MODULES.html.sh
@@ -1949,6 +1949,7 @@
   func_module ssize_t
   func_module strtok_r
   func_module sys_stat
+  func_module sys_time
   func_module tsearch
   func_module unistd
   func_module utime
--- a/lib/gethrxtime.c
+++ b/lib/gethrxtime.c
@@ -1,6 +1,6 @@
 /* gethrxtime -- get high resolution real time
 
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
 
    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
@@ -22,6 +22,7 @@
 
 #include "gethrxtime.h"
 
+#include <sys/time.h>
 #include "timespec.h"
 
 /* Get the current time, as a count of the number of nanoseconds since
--- a/lib/gettime.c
+++ b/lib/gettime.c
@@ -1,6 +1,6 @@
 /* gettime -- get the system clock
 
-   Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    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
@@ -22,6 +22,8 @@
 
 #include "timespec.h"
 
+#include <sys/time.h>
+
 /* Get the system time into *TS.  */
 
 void
@@ -36,23 +38,12 @@
     return;
 # endif
 
-# if HAVE_GETTIMEOFDAY
   {
     struct timeval tv;
     gettimeofday (&tv, NULL);
     ts->tv_sec = tv.tv_sec;
     ts->tv_nsec = tv.tv_usec * 1000;
   }
-# else
-
-#  ifndef OK_TO_USE_1S_CLOCK
-#   error "Only 1-second nominal clock resolution found.  Is that intended?" \
-          "If so, compile with the -DOK_TO_USE_1S_CLOCK option."
-#  endif
-  ts->tv_sec = time (NULL);
-  ts->tv_nsec = 0;
-
-# endif
 
 #endif
 }
--- a/lib/gettimeofday.c
+++ b/lib/gettimeofday.c
@@ -1,12 +1,7 @@
-/* Provide gettimeofday
-   1. for systems that don't have it,
-   2. for some systems where gettimeofday clobbers the static buffer that
-      localtime uses for it's return value.  The gettimeofday function from
-      Mac OS X 10.0.4, i.e. Darwin 1.3.7 has this problem.
-      The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and
-      2.6.
+/* Provide gettimeofday for systems that don't have it or for which it's broken.
 
-   Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007 Free Software
+   Foundation, Inc.
 
    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
@@ -27,18 +22,24 @@
 #include <config.h>
 
 /* Specification.  */
-#include "gettimeofday.h"
+#include <sys/time.h>
 
-#include <sys/types.h>
-#include <stdlib.h>
+#include <time.h>
 
 #if HAVE_SYS_TIMEB_H
 # include <sys/timeb.h>
 #endif
 
-#if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME
 
-static struct tm *localtime_buffer_addr;
+/* Work around the bug in some systems whereby gettimeofday clobbers
+   the static buffer that localtime uses for its return value.  The
+   gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has
+   this problem.  The tzset replacement is necessary for at least
+   Solaris 2.5, 2.5.1, and 2.6.  */
+
+static struct tm tm_zero_buffer;
+static struct tm *localtime_buffer_addr = &tm_zero_buffer;
 
 /* This is a wrapper for localtime.  It is used only on systems for which
    gettimeofday clobbers the static buffer used for localtime's result.
@@ -47,13 +48,13 @@
    localtime uses for its result.  */
 
 struct tm *
-localtime (const time_t *timep)
+localtime (time_t const *timep)
+{
 #undef localtime
-{
-  extern struct tm *localtime (const time_t *);
+  extern struct tm *localtime (time_t const *);
   struct tm *tm = localtime (timep);
 
-  if (! localtime_buffer_addr)
+  if (localtime_buffer_addr == &tm_zero_buffer)
     localtime_buffer_addr = tm;
 
   return tm;
@@ -61,107 +62,83 @@
 
 /* Same as above, since gmtime and localtime use the same buffer.  */
 struct tm *
-gmtime (const time_t *timep)
+gmtime (time_t const *timep)
+{
 #undef gmtime
-{
-  extern struct tm *gmtime (const time_t *);
+  extern struct tm *gmtime (time_t const *);
   struct tm *tm = gmtime (timep);
 
-  if (! localtime_buffer_addr)
+  if (localtime_buffer_addr == &tm_zero_buffer)
     localtime_buffer_addr = tm;
 
   return tm;
 }
 
-/* This is a wrapper for tzset. It is used only on systems for which
-   tzset may clobber the static buffer used for localtime's result.
-   Save and restore the contents of the buffer used for localtime's
-   result around the call to tzset.  */
+#endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */
+
+#if TZSET_CLOBBERS_LOCALTIME
+/* This is a wrapper for tzset, for systems on which tzset may clobber
+   the static buffer used for localtime's result.  */
 void
 tzset (void)
+{
 #undef tzset
-{
-  extern struct tm *localtime (const time_t *);
   extern void tzset (void);
-  struct tm save;
 
-  if (! localtime_buffer_addr)
-    {
-      time_t t = 0;
-      localtime_buffer_addr = localtime (&t);
-    }
-
-  save = *localtime_buffer_addr;
+  /* Save and restore the contents of the buffer used for localtime's
+     result around the call to tzset.  */
+  struct tm save = *localtime_buffer_addr;
   tzset ();
   *localtime_buffer_addr = save;
 }
-
 #endif
 
-/* This is a wrapper for gettimeofday.
-   It is used only on systems that lack this function, or for whose
-   implementation of this function causes problems. */
+/* This is a wrapper for gettimeofday.  It is used only on systems
+   that lack this function, or whose implementation of this function
+   causes problems.  */
 
 int
 gettimeofday (struct timeval *restrict tv, void *restrict tz)
+{
 #undef gettimeofday
-{
 #if HAVE_GETTIMEOFDAY
   extern int gettimeofday (/* unspecified arguments */);
-# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
-  extern struct tm *localtime (const time_t *);
-
-  /* Save and restore the contents of the buffer used for localtime's result
-     around the call to gettimeofday. */
-  struct tm save;
-  int result;
 
-  if (! localtime_buffer_addr)
-    {
-      time_t t = 0;
-      localtime_buffer_addr = localtime (&t);
-    }
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+  /* Save and restore the contents of the buffer used for localtime's
+     result around the call to gettimeofday.  */
+  struct tm save = *localtime_buffer_addr;
+# endif
 
-  save = *localtime_buffer_addr;
-  result = gettimeofday (tv, tz);
+  int result = gettimeofday (tv, tz);
+
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
   *localtime_buffer_addr = save;
+# endif
 
   return result;
 
-# else
-
-  return gettimeofday (tv, tz);
-
-# endif
 #else
 
-  /* The clock does not have microsecond resolution, so get the maximum
-     possible value for the current time that is consistent with the
-     reported clock.  That way, files are not considered to be in the
-     future merely because their time stamps have higher resolution
-     than the clock resolution.  */
-
 # if HAVE__FTIME
 
   struct _timeb timebuf;
-
   _ftime (&timebuf);
   tv->tv_sec = timebuf.time;
-  tv->tv_usec = timebuf.millitm * 1000 + 999;
-
-  return 0;
+  tv->tv_usec = timebuf.millitm * 1000;
 
 # else
 
-  time_t t = time (NULL);
+#  if !defined OK_TO_USE_1S_CLOCK
+#   error "Only 1-second nominal clock resolution found.  Is that intended?" \
+          "If so, compile with the -DOK_TO_USE_1S_CLOCK option."
+#  endif
+  tv->tv_sec = time (NULL);
+  tv->tv_usec = 0;
 
-  if (t == (time_t) -1)
-    return -1;
-  tv->tv_sec = t;
-  tv->tv_usec = 999999;
+# endif
 
   return 0;
 
-# endif
 #endif
 }
deleted file mode 100644
--- a/lib/gettimeofday.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Provide gettimeofday
-   1. for systems that don't have it,
-   2. for some systems where gettimeofday clobbers the static buffer that
-      localtime uses for it's return value.  The gettimeofday function from
-      Mac OS X 10.0.4, i.e. Darwin 1.3.7 has this problem.
-      The tzset replacement is necessary for at least Solaris 2.5, 2.5.1, and
-      2.6.
-
-   Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
-
-   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
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef GETTIMEOFDAY_H
-#define GETTIMEOFDAY_H
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#if !HAVE_STRUCT_TIMEVAL
-struct timeval
-{
-  time_t tv_sec;
-  suseconds_t tv_usec;
-};
-#endif
-
-#if !HAVE_GETTIMEOFDAY_POSIX_SIGNATURE || GETTIMEOFDAY_CLOBBERS_LOCALTIME
-# undef gettimeofday
-# define gettimeofday rpl_gettimeofday
-extern int gettimeofday (struct timeval *restrict tp, void *restrict tzp);
-#endif
-
-#endif /* GETTIMEOFDAY_H */
--- a/lib/nanosleep.c
+++ b/lib/nanosleep.c
@@ -1,7 +1,7 @@
 /* Provide a replacement for the POSIX nanosleep function.
 
-   Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006 Free Software
-   Foundation, Inc.
+   Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006, 2007 Free
+   Software Foundation, Inc.
 
    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
@@ -25,6 +25,8 @@
    prototype for rpl_nanosleep. (they'd conflict e.g., on alpha-dec-osf3.2)  */
 #undef nanosleep
 
+#include "timespec.h"
+
 #include <stdbool.h>
 #include <stdio.h>
 #include <sys/types.h>
@@ -33,23 +35,13 @@
 #endif
 #include <signal.h>
 
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
+#include <sys/time.h>
+#include <time.h>
 
 #include <errno.h>
 
 #include <unistd.h>
 
-#include "timespec.h"
-
 enum { BILLION = 1000 * 1000 * 1000 };
 
 #if HAVE_BUG_BIG_NANOSLEEP
--- a/lib/posixtm.c
+++ b/lib/posixtm.c
@@ -1,7 +1,7 @@
 /* Parse dates for touch and date.
 
    Copyright (C) 1989, 1990, 1991, 1998, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006 Free Software Foundation Inc.
+   2005, 2006, 2007 Free Software Foundation Inc.
 
    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
@@ -22,21 +22,13 @@
 
 #include <config.h>
 
-#include <stdbool.h>
+#include "posixtm.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <string.h>
 
-#ifdef TM_IN_SYS_TIME
-# include <sys/time.h>
-#else
-# include <time.h>
-#endif
-
-#include "posixtm.h"
-
 #if USE_UNLOCKED_IO
 # include "unlocked-io.h"
 #endif
--- a/lib/posixtm.h
+++ b/lib/posixtm.h
@@ -1,6 +1,6 @@
 /* Parse dates for touch and date.
 
-   Copyright (C) 1998, 2003, 2005 Free Software Foundation Inc.
+   Copyright (C) 1998, 2003, 2005, 2007 Free Software Foundation Inc.
 
    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
@@ -22,6 +22,9 @@
 #ifndef POSIXTM_H_
 # define POSIXTM_H_
 
+# include <stdbool.h>
+# include <time.h>
+
 /* POSIX Date Syntax flags.  */
 # define PDS_LEADING_YEAR 1
 # define PDS_TRAILING_YEAR 2
--- a/lib/settime.c
+++ b/lib/settime.c
@@ -1,6 +1,7 @@
 /* settime -- set the system clock
 
-   Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004, 2005, 2006, 2007 Free Software
+   Foundation, Inc.
 
    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
@@ -22,6 +23,7 @@
 
 #include "timespec.h"
 
+#include <sys/time.h>
 #include <unistd.h>
 
 #include <errno.h>
--- a/lib/strftime.c
+++ b/lib/strftime.c
@@ -36,18 +36,8 @@
 #endif
 
 #include <ctype.h>
-#include <sys/types.h>		/* Some systems define `time_t' here.  */
+#include <time.h>
 
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# ifdef HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
 #if HAVE_TZNAME && ! defined tzname
 extern char *tzname[];
 #endif
new file mode 100644
--- /dev/null
+++ b/lib/sys_time_.h
@@ -0,0 +1,44 @@
+/* Provide a more complete sys/time.h.
+
+   Copyright (C) 2007 Free Software Foundation, Inc.
+
+   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
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/* Written by Paul Eggert.  */
+
+#ifndef _gl_SYS_TIME_H
+#define _gl_SYS_TIME_H
+
+#if @HAVE_SYS_TIME_H@
+# include @ABSOLUTE_SYS_TIME_H@
+#else
+# include <time.h>
+#endif
+
+#if ! @HAVE_STRUCT_TIMEVAL@
+struct timeval
+{
+  time_t tv_sec;
+  long int tv_usec;
+};
+#endif
+
+#if ! @HAVE_GETTIMEOFDAY_POSIX_SIGNATURE@ || @GETTIMEOFDAY_CLOBBERS_LOCALTIME@
+# undef gettimeofday
+# define gettimeofday rpl_gettimeofday
+int gettimeofday (struct timeval *restrict, void *restrict);
+#endif
+
+#endif /* _gl_SYS_TIME_H */
--- a/lib/tempname.c
+++ b/lib/tempname.c
@@ -1,7 +1,8 @@
 /* tempname.c - generate the name of a temporary file.
 
    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation,
+   Inc.
 
    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
@@ -51,11 +52,7 @@
 #include <string.h>
 
 #include <fcntl.h>
-
-#if HAVE_SYS_TIME_H || _LIBC
-# include <sys/time.h>
-#endif
-
+#include <sys/time.h>
 #include <stdint.h>
 #include <unistd.h>
 
@@ -242,15 +239,11 @@
 #ifdef RANDOM_BITS
   RANDOM_BITS (random_time_bits);
 #else
-# if HAVE_GETTIMEOFDAY || _LIBC
   {
     struct timeval tv;
     __gettimeofday (&tv, NULL);
     random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
   }
-# else
-  random_time_bits = time (NULL);
-# endif
 #endif
   value += random_time_bits ^ __getpid ();
 
--- a/lib/timespec.h
+++ b/lib/timespec.h
@@ -1,6 +1,6 @@
 /* timespec -- System time interface
 
-   Copyright (C) 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002, 2004, 2005, 2007 Free Software Foundation, Inc.
 
    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
@@ -19,24 +19,17 @@
 #if ! defined TIMESPEC_H
 # define TIMESPEC_H
 
-# include <sys/types.h>
-# if TIME_WITH_SYS_TIME
+# if HAVE_SYS_TIME_H
 #  include <sys/time.h>
-#  include <time.h>
-# else
-#  if HAVE_SYS_TIME_H
-#   include <sys/time.h>
-#  else
-#   include <time.h>
-#  endif
 # endif
+# include <time.h>
 
 # if ! HAVE_STRUCT_TIMESPEC
 /* Some systems don't define this struct, e.g., AIX 4.1, Ultrix 4.3.  */
 struct timespec
 {
   time_t tv_sec;
-  long tv_nsec;
+  long int tv_nsec;
 };
 # endif
 
--- a/lib/utimens.c
+++ b/lib/utimens.c
@@ -1,6 +1,7 @@
 /* Set file access and modification times.
 
-   Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software
+   Foundation, Inc.
 
    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 the
@@ -26,6 +27,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <sys/time.h>
 #include <unistd.h>
 
 #if HAVE_UTIME_H
--- a/m4/gettimeofday.m4
+++ b/m4/gettimeofday.m4
@@ -1,86 +1,45 @@
-#serial 8
+#serial 9
 
 # Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+dnl From Jim Meyering.
+
 AC_DEFUN([gl_FUNC_GETTIMEOFDAY],
 [
   AC_REQUIRE([AC_C_RESTRICT])
-  AC_REQUIRE([AC_HEADER_TIME])
-  AC_CHECK_HEADERS_ONCE([sys/time.h])
-  AC_CHECK_FUNCS([gettimeofday])
-  
-  AC_CHECK_TYPE([suseconds_t], ,
-    [AC_DEFINE([suseconds_t], [int],
-       [Define to `int' if `suseconds_t' is missing.])
-    ],
-    [
-#    if TIME_WITH_SYS_TIME
-#     include <sys/time.h>
-#     include <time.h>
-#    else
-#     if HAVE_SYS_TIME_H
-#      include <sys/time.h>
-#     else
-#      include <time.h>
-#     endif
-#    endif
-    ])
+  AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+  AC_CHECK_FUNCS_ONCE([gettimeofday])
 
-  AC_CACHE_CHECK([for struct timeval], [fu_cv_sys_struct_timeval],
-    [AC_TRY_COMPILE(
-      [
-#      if TIME_WITH_SYS_TIME
-#       include <sys/time.h>
-#       include <time.h>
-#      else
-#       if HAVE_SYS_TIME_H
-#        include <sys/time.h>
-#       else
-#        include <time.h>
-#       endif
-#      endif
-      ],
-      [static struct timeval x; x.tv_sec = x.tv_usec;],
-      fu_cv_sys_struct_timeval=yes,
-      fu_cv_sys_struct_timeval=no)
-    ])
-
-  if test $fu_cv_sys_struct_timeval = yes; then
-    AC_DEFINE(HAVE_STRUCT_TIMEVAL, 1,
-      [Define if struct timeval is declared in <time.h> or <sys/time.h>. ])
-  fi
-  
-  AC_CACHE_CHECK([for gettimeofday whose signature conforms to POSIX],
-    [ac_cv_func_gettimeofday_posix_signature],
-    [AC_LINK_IFELSE(
+  AC_CACHE_CHECK([for gettimeofday with POSIX signature],
+    [gl_cv_func_gettimeofday_posix_signature],
+    [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
-          [[#include <sys/time.h>
-	    time_t a;
-	    suseconds_t b;
+	  [[#include <sys/time.h>
 	    struct timeval c;
 	  ]],
 	  [[
-	    int x = gettimeofday (&c, 0);
 	    int (*f) (struct timeval *restrict, void *restrict) = gettimeofday;
+	    int x = f (&c, 0);
 	    return !(x | c.tv_sec | c.tv_usec);
 	  ]])],
-       [ac_cv_func_gettimeofday_posix_signature=yes],
-       [ac_cv_func_gettimeofday_posix_signature=no])])
-  if test $ac_cv_func_gettimeofday_posix_signature = yes; then
-    AC_DEFINE([HAVE_GETTIMEOFDAY_POSIX_SIGNATURE], 1,
-      [Define if gettimeofday's signature conforms to POSIX.])
-    AC_FUNC_GETTIMEOFDAY_CLOBBER
-  else
-    gl_PREREQ_GETTIMEOFDAY
-    AC_LIBOBJ([gettimeofday])
+	[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
+    HAVE_GETTIMEOFDAY_POSIX_SIGNATURE=0
+    if test $gl_cv_func_gettimeofday_clobber != yes; then
+      AC_LIBOBJ(gettimeofday)
+      gl_PREREQ_GETTIMEOFDAY
+    fi
   fi
 ])
 
-dnl From Jim Meyering.
-dnl
+
 dnl See if gettimeofday clobbers the static buffer that localtime uses
 dnl for its return value.  The gettimeofday function from Mac OS X 10.0.4
 dnl (i.e., Darwin 1.3.7) has this problem.
@@ -88,70 +47,53 @@
 dnl If it does, then arrange to use gettimeofday and localtime only via
 dnl the wrapper functions that work around the problem.
 
-AC_DEFUN([AC_FUNC_GETTIMEOFDAY_CLOBBER],
+AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
 [
- AC_REQUIRE([AC_HEADER_TIME])
- AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
-  [jm_cv_func_gettimeofday_clobber],
-  [AC_TRY_RUN([
-#include <stdio.h>
-#include <string.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include <stdlib.h>
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
 
-int
-main ()
-{
-  time_t t = 0;
-  struct tm *lt;
-  struct tm saved_lt;
-  struct timeval tv;
-  lt = localtime (&t);
-  saved_lt = *lt;
-  gettimeofday (&tv, NULL);
-  if (memcmp (lt, &saved_lt, sizeof (struct tm)) != 0)
-    exit (1);
+ AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
+  [gl_cv_func_gettimeofday_clobber],
+  [AC_RUN_IFELSE(
+     [AC_LANG_PROGRAM(
+	[[#include <string.h>
+	  #include <sys/time.h>
+	  #include <time.h>
+	  #include <stdlib.h>
+	]],
+	[[
+	  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],
+     dnl When crosscompiling, assume it is broken.
+     [gl_cv_func_gettimeofday_clobber=yes])])
 
-  exit (0);
-}
-	  ],
-	 jm_cv_func_gettimeofday_clobber=no,
-	 jm_cv_func_gettimeofday_clobber=yes,
-	 dnl When crosscompiling, assume it is broken.
-	 jm_cv_func_gettimeofday_clobber=yes)
-  ])
-  if test $jm_cv_func_gettimeofday_clobber = yes; then
-    gl_GETTIMEOFDAY_REPLACE_LOCALTIME
-  fi
+ if test $gl_cv_func_gettimeofday_clobber = yes; then
+   gl_GETTIMEOFDAY_REPLACE_LOCALTIME
+   GETTIMEOFDAY_CLOBBERS_LOCALTIME=1
+   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([GETTIMEOFDAY_CLOBBERS_LOCALTIME], 1,
-    [Define if gettimeofday clobbers the localtime buffer.])
   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_DEFINE([tzset], [rpl_tzset],
-    [Define to rpl_tzset if the replacement function should be used.])
 ])
 
 # Prerequisites of lib/gettimeofday.c.
 AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [
-  AC_REQUIRE([AC_HEADER_TIME])
   AC_CHECK_HEADERS([sys/timeb.h])
   AC_CHECK_FUNCS([_ftime])
 ])
--- a/m4/mktime.m4
+++ b/m4/mktime.m4
@@ -1,5 +1,5 @@
-#serial 9
-dnl Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+#serial 10
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -13,25 +13,14 @@
 # AC_FUNC_MKTIME
 # --------------
 AC_DEFUN([AC_FUNC_MKTIME],
-[AC_REQUIRE([AC_HEADER_TIME])dnl
-AC_CHECK_HEADERS_ONCE(sys/time.h unistd.h)
+[AC_CHECK_HEADERS_ONCE(sys/time.h unistd.h)
 AC_CHECK_FUNCS_ONCE(alarm)
 AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
 [AC_RUN_IFELSE([AC_LANG_SOURCE(
 [[/* Test program from Paul Eggert and Tony Leneis.  */
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# ifdef HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
 #include <limits.h>
 #include <stdlib.h>
+#include <time.h>
 
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
--- a/m4/nanosleep.m4
+++ b/m4/nanosleep.m4
@@ -1,12 +1,12 @@
-#serial 19
+#serial 20
 
 dnl From Jim Meyering.
 dnl Check for the nanosleep function.
 dnl If not found, use the supplied replacement.
 dnl
 
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006 Free Software
-# Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 Free
+# Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -17,7 +17,6 @@
  dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
- AC_REQUIRE([AC_HEADER_TIME])
  AC_REQUIRE([gl_CLOCK_TIME])
  AC_CHECK_HEADERS_ONCE(sys/time.h)
 
@@ -34,19 +33,13 @@
   [
    AC_RUN_IFELSE(
      [AC_LANG_SOURCE([[
-	#if TIME_WITH_SYS_TIME
-	 #include <sys/time.h>
-	 #include <time.h>
-	#else
-	 #if HAVE_SYS_TIME_H
-	  #include <sys/time.h>
-	 #else
-	  #include <time.h>
-	 #endif
-	#endif
 	#include <errno.h>
 	#include <limits.h>
 	#include <signal.h>
+	#if HAVE_SYS_TIME_H
+	 #include <sys/time.h>
+	#endif
+	#include <time.h>
 	#include <unistd.h>
 	#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
 	#define TYPE_MAXIMUM(t) \
--- a/m4/posixtm.m4
+++ b/m4/posixtm.m4
@@ -1,5 +1,5 @@
-# posixtm.m4 serial 5
-dnl Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+# posixtm.m4 serial 6
+dnl Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -8,6 +8,5 @@
 [
   AC_LIBOBJ(posixtm)
 
-  dnl Prerequisites of lib/posixtm.c.
-  AC_STRUCT_TM
+  dnl No prerequisites of lib/posixtm.c.
 ])
--- a/m4/stat-time.m4
+++ b/m4/stat-time.m4
@@ -1,6 +1,6 @@
 # Checks for stat-related time functions.
 
-# Copyright (C) 1998, 1999, 2001, 2003, 2005, 2006 Free Software
+# Copyright (C) 1998, 1999, 2001, 2003, 2005, 2006, 2007 Free Software
 # Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
@@ -19,6 +19,7 @@
 [
   AC_REQUIRE([AC_C_INLINE])
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_CHECK_HEADERS_ONCE([sys/time.h])
 
   AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec],
     [AC_CACHE_CHECK([whether struct stat.st_atim is of type struct timespec],
@@ -26,17 +27,11 @@
        [AC_TRY_COMPILE(
 	  [
 	    #include <sys/types.h>
-	    #if TIME_WITH_SYS_TIME
+	    #include <sys/stat.h>
+	    #if HAVE_SYS_TIME_H
 	    # include <sys/time.h>
-	    # include <time.h>
-	    #else
-	    # if HAVE_SYS_TIME_H
-	    #  include <sys/time.h>
-	    # else
-	    #  include <time.h>
-	    # endif
 	    #endif
-	    #include <sys/stat.h>
+	    #include <time.h>
 	    struct timespec ts;
 	    struct stat st;
 	  ],
--- a/m4/strftime.m4
+++ b/m4/strftime.m4
@@ -1,7 +1,7 @@
 #serial 28
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+# 2006, 2007 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,6 @@
  # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE.
  AC_REQUIRE([AC_STRUCT_TIMEZONE])
 
- AC_REQUIRE([AC_HEADER_TIME])
  AC_REQUIRE([AC_TYPE_MBSTATE_T])
  AC_REQUIRE([gl_TM_GMTOFF])
 
new file mode 100644
--- /dev/null
+++ b/m4/sys_time_h.m4
@@ -0,0 +1,49 @@
+# Configure a replacement for <sys/time.h>.
+
+# Copyright (C) 2007 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Written by Paul Eggert and Martin Lambers.
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H],
+[
+  AC_REQUIRE([AC_C_RESTRICT])
+  AC_CHECK_HEADERS_ONCE([sys/time.h])
+
+  if test $ac_cv_header_sys_time_h = yes; then
+    gl_ABSOLUTE_HEADER([sys/time.h])
+    ABSOLUTE_SYS_TIME_H=\"$gl_cv_absolute_sys_time_h\"
+    HAVE_SYS_TIME_H=1
+  else
+    ABSOLUTE_SYS_TIME_H=\"no/such/file/sys/time.h\"
+    HAVE_SYS_TIME_H=0
+  fi
+  AC_SUBST([ABSOLUTE_SYS_TIME_H])
+  AC_SUBST([HAVE_SYS_TIME_H])
+
+  AC_CACHE_CHECK([for struct timeval], [gl_cv_sys_struct_timeval],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+	  [[#if HAVE_SYS_TIME_H
+	     #include <sys/time.h>
+	    #endif
+	    #include <time.h>
+	  ]],
+	  [[static struct timeval x; x.tv_sec = x.tv_usec;]])],
+       [gl_cv_sys_struct_timeval=yes],
+       [gl_cv_sys_struct_timeval=no])])
+  if test $gl_cv_sys_struct_timeval = yes; then
+    HAVE_STRUCT_TIMEVAL=1
+  else
+    HAVE_STRUCT_TIMEVAL=0
+  fi
+  AC_SUBST([HAVE_STRUCT_TIMEVAL])
+
+  dnl Assume POSIX behavior unless another module says otherwise.
+  HAVE_GETTIMEOFDAY_POSIX_SIGNATURE=1
+  AC_SUBST([HAVE_GETTIMEOFDAY_POSIX_SIGNATURE])
+  GETTIMEOFDAY_CLOBBERS_LOCALTIME=0
+  AC_SUBST([GETTIMEOFDAY_CLOBBERS_LOCALTIME])
+])
--- a/m4/timespec.m4
+++ b/m4/timespec.m4
@@ -1,6 +1,6 @@
-#serial 12
+#serial 13
 
-# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006 Free Software
+# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2007 Free Software
 # Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
@@ -13,7 +13,6 @@
 [
   dnl Prerequisites of lib/timespec.h.
   AC_REQUIRE([AC_C_INLINE])
-  AC_REQUIRE([AC_HEADER_TIME])
   AC_CHECK_HEADERS_ONCE(sys/time.h)
   gl_CHECK_TYPE_STRUCT_TIMESPEC
 
@@ -31,28 +30,20 @@
   dnl Persuade pedantic Solaris to declare struct timespec.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
-  AC_REQUIRE([AC_HEADER_TIME])
   AC_CHECK_HEADERS_ONCE(sys/time.h)
-  AC_CACHE_CHECK([for struct timespec], fu_cv_sys_struct_timespec,
-    [AC_TRY_COMPILE(
-      [
-#      if TIME_WITH_SYS_TIME
-#       include <sys/time.h>
-#       include <time.h>
-#      else
-#       if HAVE_SYS_TIME_H
-#        include <sys/time.h>
-#       else
-#        include <time.h>
-#       endif
-#      endif
-      ],
-      [static struct timespec x; x.tv_sec = x.tv_nsec;],
-      fu_cv_sys_struct_timespec=yes,
-      fu_cv_sys_struct_timespec=no)
-    ])
+  AC_CACHE_CHECK([for struct timespec], [gl_cv_sys_struct_timespec],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+	  [[#if HAVE_SYS_TIME_H
+	     #include <sys/time.h>
+	    #endif
+	    #include <time.h>
+	  ]],
+	  [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+       [gl_cv_sys_struct_timespec=yes],
+       [gl_cv_sys_struct_timespec=no])])
 
-  if test $fu_cv_sys_struct_timespec = yes; then
+  if test $gl_cv_sys_struct_timespec = yes; then
     AC_DEFINE(HAVE_STRUCT_TIMESPEC, 1,
 	      [Define if struct timespec is declared in <time.h>. ])
   fi
--- a/m4/tzset.m4
+++ b/m4/tzset.m4
@@ -1,6 +1,6 @@
-#serial 2
+#serial 3
 
-# Copyright (C) 2003 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2007 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,21 +15,12 @@
 
 AC_DEFUN([gl_FUNC_TZSET_CLOBBER],
 [
-  AC_REQUIRE([AC_HEADER_TIME])
+  AC_REQUIRE([gl_HEADER_SYS_TIME_H])
   AC_CACHE_CHECK([whether tzset clobbers localtime buffer],
                  gl_cv_func_tzset_clobber,
   [
   AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
+#include <time.h>
 #include <stdlib.h>
 
 int
@@ -42,12 +33,12 @@
   s = *p;
   putenv ("TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00");
   tzset ();
-  exit (p->tm_year != s.tm_year
-        || p->tm_mon != s.tm_mon
-        || p->tm_mday != s.tm_mday
-        || p->tm_hour != s.tm_hour
-        || p->tm_min != s.tm_min
-        || p->tm_sec != s.tm_sec);
+  return (p->tm_year != s.tm_year
+	  || p->tm_mon != s.tm_mon
+	  || p->tm_mday != s.tm_mday
+	  || p->tm_hour != s.tm_hour
+	  || p->tm_min != s.tm_min
+	  || p->tm_sec != s.tm_sec);
 }
   ]])],
        [gl_cv_func_tzset_clobber=no],
@@ -62,7 +53,7 @@
 
     AC_DEFINE(tzset, rpl_tzset,
       [Define to rpl_tzset if the wrapper function should be used.])
-    AC_DEFINE(TZSET_CLOBBERS_LOCALTIME_BUFFER, 1,
+    AC_DEFINE([TZSET_CLOBBERS_LOCALTIME], 1,
       [Define if tzset clobbers localtime's static buffer.])
   fi
 ])
--- a/m4/utimbuf.m4
+++ b/m4/utimbuf.m4
@@ -1,6 +1,6 @@
-#serial 7
+#serial 8
 
-# Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004 Free Software
+# Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2007 Free Software
 # Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
@@ -16,30 +16,22 @@
 AC_DEFUN([gl_CHECK_TYPE_STRUCT_UTIMBUF],
 [
   AC_CHECK_HEADERS_ONCE(sys/time.h utime.h)
-  AC_REQUIRE([AC_HEADER_TIME])
-  AC_CACHE_CHECK([for struct utimbuf], fu_cv_sys_struct_utimbuf,
-    [AC_TRY_COMPILE(
-      [
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# ifdef HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#ifdef HAVE_UTIME_H
-# include <utime.h>
-#endif
-      ],
-      [static struct utimbuf x; x.actime = x.modtime;],
-      fu_cv_sys_struct_utimbuf=yes,
-      fu_cv_sys_struct_utimbuf=no)
-    ])
+  AC_CACHE_CHECK([for struct utimbuf], [gl_cv_sys_struct_utimbuf],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+	  [[#if HAVE_SYS_TIME_H
+	     #include <sys/time.h>
+	    #endif
+	    #include <time.h>
+	    #ifdef HAVE_UTIME_H
+	     #include <utime.h>
+	    #endif
+	  ]],
+	  [[static struct utimbuf x; x.actime = x.modtime;]])],
+       [gl_cv_sys_struct_utimbuf=yes],
+       [gl_cv_sys_struct_utimbuf=no])])
 
-  if test $fu_cv_sys_struct_utimbuf = yes; then
+  if test $gl_cv_sys_struct_utimbuf = yes; then
     AC_DEFINE(HAVE_STRUCT_UTIMBUF, 1,
       [Define if struct utimbuf is declared -- usually in <utime.h>.
        Some systems have utime.h but don't declare the struct anywhere. ])
--- a/modules/gethrxtime
+++ b/modules/gethrxtime
@@ -10,8 +10,9 @@
 
 Depends-on:
 clock-time
+extensions
 gettime
-extensions
+sys_time
 
 configure.ac:
 gl_GETHRXTIME
--- a/modules/gettime
+++ b/modules/gettime
@@ -9,6 +9,7 @@
 clock-time
 gettime
 gettimeofday
+sys_time
 timespec
 extensions
 
--- a/modules/gettimeofday
+++ b/modules/gettimeofday
@@ -2,11 +2,11 @@
 gettimeofday() function: return current time.
 
 Files:
-lib/gettimeofday.h
 lib/gettimeofday.c
 m4/gettimeofday.m4
 
 Depends-on:
+sys_time
 
 configure.ac:
 gl_FUNC_GETTIMEOFDAY
@@ -14,11 +14,10 @@
 Makefile.am:
 
 Include:
-"gettimeofday.h"
+<sys/time.h>
 
 License:
 GPL
 
 Maintainer:
-Jim Meyering
-
+Paul Eggert, Jim Meyering
--- a/modules/nanosleep
+++ b/modules/nanosleep
@@ -7,9 +7,10 @@
 
 Depends-on:
 clock-time
-timespec
+extensions
 stdbool
-extensions
+sys_time
+timespec
 
 configure.ac:
 gl_FUNC_NANOSLEEP
--- a/modules/settime
+++ b/modules/settime
@@ -8,6 +8,7 @@
 Depends-on:
 clock-time
 extensions
+sys_time
 timespec
 
 configure.ac:
new file mode 100644
--- /dev/null
+++ b/modules/sys_time
@@ -0,0 +1,40 @@
+Description:
+A <sys/time.h> that conforms better to POSIX.
+
+Files:
+lib/sys_time_.h
+m4/sys_time_h.m4
+
+Depends-on:
+absolute-header
+
+configure.ac:
+gl_HEADER_SYS_TIME_H
+
+Makefile.am:
+BUILT_SOURCES += sys/time.h
+
+# We need the following in order to create <sys/time.h> when the system
+# doesn't have one that works with the given compiler.
+sys/time.h: sys_time_.h
+	test -d sys || mkdir sys
+	rm -f $@-t $@
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \
+	      -e 's|@''ABSOLUTE_SYS_TIME_H''@|$(ABSOLUTE_SYS_TIME_H)|g' \
+	      -e 's/@''GETTIMEOFDAY_CLOBBERS_LOCALTIME''@/$(GETTIMEOFDAY_CLOBBERS_LOCALTIME)/g' \
+	      -e 's/@''HAVE_GETTIMEOFDAY_POSIX_SIGNATURE''@/$(HAVE_GETTIMEOFDAY_POSIX_SIGNATURE)/g' \
+	      -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
+	      < $(srcdir)/sys_time_.h; \
+	} > $@-t
+	mv $@-t $@
+MOSTLYCLEANFILES += sys/time.h sys/time.h-t
+
+Include:
+#include <sys/time.h>
+
+License:
+LGPL
+
+Maintainer:
+all
--- a/modules/tempname
+++ b/modules/tempname
@@ -8,8 +8,10 @@
 
 Depends-on:
 extensions
+gettimeofday
 stdint
 sys_stat
+sys_time
 
 configure.ac:
 gl_FUNC_GEN_TEMPNAME
--- a/modules/utimens
+++ b/modules/utimens
@@ -9,6 +9,7 @@
 m4/utimes.m4
 
 Depends-on:
+sys_time
 timespec
 
 configure.ac:
--- a/tests/test-gettimeofday.c
+++ b/tests/test-gettimeofday.c
@@ -19,11 +19,11 @@
 
 #include <config.h>
 
+#include <sys/time.h>
+
 #include <stdio.h>
 #include <string.h>
 
-#include "gettimeofday.h"
-
 suseconds_t dummy = 0;	/* just to test if this type is available */
 
 int