mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Check for timegm and use it where available.
This commit is contained in:
parent
0561a866c3
commit
bb8a5f2eb9
@ -204,7 +204,7 @@ dnl
|
|||||||
AC_FUNC_ALLOCA
|
AC_FUNC_ALLOCA
|
||||||
AC_FUNC_MMAP
|
AC_FUNC_MMAP
|
||||||
AC_FUNC_FSEEKO
|
AC_FUNC_FSEEKO
|
||||||
AC_CHECK_FUNCS(strptime snprintf vsnprintf)
|
AC_CHECK_FUNCS(strptime timegm snprintf vsnprintf)
|
||||||
AC_CHECK_FUNCS(usleep ftello sigblock sigsetjmp symlink)
|
AC_CHECK_FUNCS(usleep ftello sigblock sigsetjmp symlink)
|
||||||
|
|
||||||
dnl We expect to have these functions on Unix-like systems configure
|
dnl We expect to have these functions on Unix-like systems configure
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
|
* http.c (mktime_from_utc): Renamed to timegm and moved to cmpt.c.
|
||||||
|
Don't compile it if GNU timegm is available.
|
||||||
|
(http_atotm): Use timegm.
|
||||||
|
|
||||||
2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
|
2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
* http.c (http_atotm): Correctly query the old locale value.
|
* http.c (http_atotm): Correctly query the old locale value.
|
||||||
|
68
src/cmpt.c
68
src/cmpt.c
@ -1222,3 +1222,71 @@ fnmatch (const char *pattern, const char *string, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* not SYSTEM_FNMATCH */
|
#endif /* not SYSTEM_FNMATCH */
|
||||||
|
|
||||||
|
#ifndef HAVE_TIMEGM
|
||||||
|
/* timegm is a GNU extension typically unavailable on non-glibc-based
|
||||||
|
platforms. */
|
||||||
|
|
||||||
|
/* Inverse of gmtime: converts struct tm to time_t, assuming the data
|
||||||
|
in tm is UTC rather than local timezone.
|
||||||
|
|
||||||
|
mktime is similar but assumes struct tm, also known as the
|
||||||
|
"broken-down" form of time, is in local time zone. This
|
||||||
|
implementation of timegm uses mktime to make the conversion
|
||||||
|
understanding that an offset will be introduced by the local time
|
||||||
|
assumption.
|
||||||
|
|
||||||
|
timegm then measures the introduced offset by applying gmtime to
|
||||||
|
the initial result and applying mktime to the resulting
|
||||||
|
"broken-down" form. The difference between the two mktime results
|
||||||
|
is the measured offset which is then subtracted from the initial
|
||||||
|
mktime result to yield a calendar time which is the value returned.
|
||||||
|
|
||||||
|
tm_isdst in struct tm is set to 0 to force mktime to introduce a
|
||||||
|
consistent offset (the non DST offset) since tm and tm+o might be
|
||||||
|
on opposite sides of a DST change.
|
||||||
|
|
||||||
|
Some implementations of mktime return -1 for the nonexistent
|
||||||
|
localtime hour at the beginning of DST. In this event, use
|
||||||
|
mktime(tm - 1hr) + 3600.
|
||||||
|
|
||||||
|
Schematically
|
||||||
|
mktime(tm) --> t+o
|
||||||
|
gmtime(t+o) --> tm+o
|
||||||
|
mktime(tm+o) --> t+2o
|
||||||
|
t+o - (t+2o - t+o) = t
|
||||||
|
|
||||||
|
Contributed by Roger Beeman <beeman@cisco.com>, with the help of
|
||||||
|
Mark Baushke <mdb@cisco.com> and other experts at CISCO. Further
|
||||||
|
improved by Roger with assistance from Edward J. Sabol based on
|
||||||
|
input by Jamie Zawinski. */
|
||||||
|
|
||||||
|
time_t
|
||||||
|
timegm (struct tm *t)
|
||||||
|
{
|
||||||
|
time_t tl, tb;
|
||||||
|
struct tm *tg;
|
||||||
|
|
||||||
|
tl = mktime (t);
|
||||||
|
if (tl == -1)
|
||||||
|
{
|
||||||
|
t->tm_hour--;
|
||||||
|
tl = mktime (t);
|
||||||
|
if (tl == -1)
|
||||||
|
return -1; /* can't deal with contents of T */
|
||||||
|
tl += 3600;
|
||||||
|
}
|
||||||
|
tg = gmtime (&tl);
|
||||||
|
tg->tm_isdst = 0;
|
||||||
|
tb = mktime (tg);
|
||||||
|
if (tb == -1)
|
||||||
|
{
|
||||||
|
tg->tm_hour--;
|
||||||
|
tb = mktime (tg);
|
||||||
|
if (tb == -1)
|
||||||
|
return -1; /* can't deal with output from gmtime */
|
||||||
|
tb += 3600;
|
||||||
|
}
|
||||||
|
return (tl - (tb - tl));
|
||||||
|
}
|
||||||
|
#endif /* HAVE_TIMEGM */
|
||||||
|
72
src/http.c
72
src/http.c
@ -2501,74 +2501,6 @@ The sizes do not match (local %s) -- retrieving.\n"),
|
|||||||
return TRYLIMEXC;
|
return TRYLIMEXC;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Converts struct tm to time_t, assuming the data in tm is UTC rather
|
|
||||||
than local timezone.
|
|
||||||
|
|
||||||
mktime is similar but assumes struct tm, also known as the
|
|
||||||
"broken-down" form of time, is in local time zone. mktime_from_utc
|
|
||||||
uses mktime to make the conversion understanding that an offset
|
|
||||||
will be introduced by the local time assumption.
|
|
||||||
|
|
||||||
mktime_from_utc then measures the introduced offset by applying
|
|
||||||
gmtime to the initial result and applying mktime to the resulting
|
|
||||||
"broken-down" form. The difference between the two mktime results
|
|
||||||
is the measured offset which is then subtracted from the initial
|
|
||||||
mktime result to yield a calendar time which is the value returned.
|
|
||||||
|
|
||||||
tm_isdst in struct tm is set to 0 to force mktime to introduce a
|
|
||||||
consistent offset (the non DST offset) since tm and tm+o might be
|
|
||||||
on opposite sides of a DST change.
|
|
||||||
|
|
||||||
Some implementations of mktime return -1 for the nonexistent
|
|
||||||
localtime hour at the beginning of DST. In this event, use
|
|
||||||
mktime(tm - 1hr) + 3600.
|
|
||||||
|
|
||||||
Schematically
|
|
||||||
mktime(tm) --> t+o
|
|
||||||
gmtime(t+o) --> tm+o
|
|
||||||
mktime(tm+o) --> t+2o
|
|
||||||
t+o - (t+2o - t+o) = t
|
|
||||||
|
|
||||||
Note that glibc contains a function of the same purpose named
|
|
||||||
`timegm' (reverse of gmtime). But obviously, it is not universally
|
|
||||||
available, and unfortunately it is not straightforwardly
|
|
||||||
extractable for use here. Perhaps configure should detect timegm
|
|
||||||
and use it where available.
|
|
||||||
|
|
||||||
Contributed by Roger Beeman <beeman@cisco.com>, with the help of
|
|
||||||
Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO.
|
|
||||||
Further improved by Roger with assistance from Edward J. Sabol
|
|
||||||
based on input by Jamie Zawinski. */
|
|
||||||
|
|
||||||
static time_t
|
|
||||||
mktime_from_utc (struct tm *t)
|
|
||||||
{
|
|
||||||
time_t tl, tb;
|
|
||||||
struct tm *tg;
|
|
||||||
|
|
||||||
tl = mktime (t);
|
|
||||||
if (tl == -1)
|
|
||||||
{
|
|
||||||
t->tm_hour--;
|
|
||||||
tl = mktime (t);
|
|
||||||
if (tl == -1)
|
|
||||||
return -1; /* can't deal with output from strptime */
|
|
||||||
tl += 3600;
|
|
||||||
}
|
|
||||||
tg = gmtime (&tl);
|
|
||||||
tg->tm_isdst = 0;
|
|
||||||
tb = mktime (tg);
|
|
||||||
if (tb == -1)
|
|
||||||
{
|
|
||||||
tg->tm_hour--;
|
|
||||||
tb = mktime (tg);
|
|
||||||
if (tb == -1)
|
|
||||||
return -1; /* can't deal with output from gmtime */
|
|
||||||
tb += 3600;
|
|
||||||
}
|
|
||||||
return (tl - (tb - tl));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check whether the result of strptime() indicates success.
|
/* Check whether the result of strptime() indicates success.
|
||||||
strptime() returns the pointer to how far it got to in the string.
|
strptime() returns the pointer to how far it got to in the string.
|
||||||
The processing has been successful if the string is at `GMT' or
|
The processing has been successful if the string is at `GMT' or
|
||||||
@ -2652,12 +2584,12 @@ http_atotm (const char *time_string)
|
|||||||
|
|
||||||
/* Some versions of strptime use the existing contents of struct
|
/* Some versions of strptime use the existing contents of struct
|
||||||
tm to recalculate the date according to format. Zero it out
|
tm to recalculate the date according to format. Zero it out
|
||||||
to prevent garbage from the stack influencing strptime. */
|
to prevent stack garbage from influencing strptime. */
|
||||||
xzero (t);
|
xzero (t);
|
||||||
|
|
||||||
if (check_end (strptime (time_string, time_formats[i], &t)))
|
if (check_end (strptime (time_string, time_formats[i], &t)))
|
||||||
{
|
{
|
||||||
ret = mktime_from_utc (&t);
|
ret = timegm (&t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,6 +131,10 @@ int strncasecmp ();
|
|||||||
#ifndef HAVE_STRPTIME
|
#ifndef HAVE_STRPTIME
|
||||||
char *strptime ();
|
char *strptime ();
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef HAVE_TIMEGM
|
||||||
|
# include <time.h>
|
||||||
|
time_t timegm (struct tm *);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* These are defined in snprintf.c. It would be nice to have an
|
/* These are defined in snprintf.c. It would be nice to have an
|
||||||
snprintf.h, though. */
|
snprintf.h, though. */
|
||||||
|
Loading…
Reference in New Issue
Block a user