summaryrefslogtreecommitdiff
path: root/gnulib/lib/gettimeofday.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnulib/lib/gettimeofday.c')
-rw-r--r--gnulib/lib/gettimeofday.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/gnulib/lib/gettimeofday.c b/gnulib/lib/gettimeofday.c
index 88295ce..ad65c6d 100644
--- a/gnulib/lib/gettimeofday.c
+++ b/gnulib/lib/gettimeofday.c
@@ -1,7 +1,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-2003, 2005-2007, 2009-2013 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
@@ -14,8 +13,7 @@
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. */
+ along with this program; if not, see <http://www.gnu.org/licenses/>. */
/* written by Jim Meyering */
@@ -41,6 +39,12 @@
static struct tm tm_zero_buffer;
static struct tm *localtime_buffer_addr = &tm_zero_buffer;
+# undef localtime
+extern struct tm *localtime (time_t const *);
+
+# undef gmtime
+extern struct tm *gmtime (time_t const *);
+
/* This is a wrapper for localtime. It is used only on systems for which
gettimeofday clobbers the static buffer used for localtime's result.
@@ -50,8 +54,6 @@ static struct tm *localtime_buffer_addr = &tm_zero_buffer;
struct tm *
rpl_localtime (time_t const *timep)
{
-#undef localtime
- extern struct tm *localtime (time_t const *);
struct tm *tm = localtime (timep);
if (localtime_buffer_addr == &tm_zero_buffer)
@@ -64,8 +66,6 @@ rpl_localtime (time_t const *timep)
struct tm *
rpl_gmtime (time_t const *timep)
{
-#undef gmtime
- extern struct tm *gmtime (time_t const *);
struct tm *tm = gmtime (timep);
if (localtime_buffer_addr == &tm_zero_buffer)
@@ -77,14 +77,15 @@ rpl_gmtime (time_t const *timep)
#endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */
#if TZSET_CLOBBERS_LOCALTIME
+
+# undef tzset
+extern void tzset (void);
+
/* This is a wrapper for tzset, for systems on which tzset may clobber
the static buffer used for localtime's result. */
void
rpl_tzset (void)
{
-#undef tzset
- extern void tzset (void);
-
/* Save and restore the contents of the buffer used for localtime's
result around the call to tzset. */
struct tm save = *localtime_buffer_addr;
@@ -98,7 +99,7 @@ rpl_tzset (void)
causes problems. */
int
-rpl_gettimeofday (struct timeval *restrict tv, void *restrict tz)
+gettimeofday (struct timeval *restrict tv, void *restrict tz)
{
#undef gettimeofday
#if HAVE_GETTIMEOFDAY
@@ -108,7 +109,18 @@ rpl_gettimeofday (struct timeval *restrict tv, void *restrict tz)
struct tm save = *localtime_buffer_addr;
# endif
- int result = gettimeofday (tv, tz);
+# if defined timeval /* 'struct timeval' overridden by gnulib? */
+# undef timeval
+ struct timeval otv;
+ int result = gettimeofday (&otv, (struct timezone *) tz);
+ if (result == 0)
+ {
+ tv->tv_sec = otv.tv_sec;
+ tv->tv_usec = otv.tv_usec;
+ }
+# else
+ int result = gettimeofday (tv, (struct timezone *) tz);
+# endif
# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
*localtime_buffer_addr = save;