|
@@ -827,34 +827,66 @@ static int MonthConv(char *Month)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
/*}}}*/
|
|
/*}}}*/
|
|
|
-// timegm - Internal timegm function if gnu is not available /*{{{*/
|
|
|
|
|
|
|
+// timegm - Internal timegm if the gnu version is not available /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------
|
|
|
-/* Ripped this evil little function from wget - I prefer the use of
|
|
|
|
|
- GNU timegm if possible as this technique will have interesting problems
|
|
|
|
|
- with leap seconds, timezones and other.
|
|
|
|
|
-
|
|
|
|
|
- Converts struct tm to time_t, assuming the data in tm is UTC rather
|
|
|
|
|
|
|
+/* Converts struct tm to time_t, assuming the data in tm is UTC rather
|
|
|
than local timezone (mktime assumes the latter).
|
|
than local timezone (mktime assumes the latter).
|
|
|
-
|
|
|
|
|
- Contributed by Roger Beeman <beeman@cisco.com>, with the help of
|
|
|
|
|
- Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO. */
|
|
|
|
|
-
|
|
|
|
|
-/* Turned it into an autoconf check, because GNU is not the only thing which
|
|
|
|
|
- can provide timegm. -- 2002-09-22, Joel Baker */
|
|
|
|
|
|
|
|
|
|
-#ifndef HAVE_TIMEGM // Now with autoconf!
|
|
|
|
|
|
|
+ This function is a nonstandard GNU extension that is also present on
|
|
|
|
|
+ the BSDs and maybe other systems. For others we follow the advice of
|
|
|
|
|
+ the manpage of timegm and use his portable replacement. */
|
|
|
|
|
+#ifndef HAVE_TIMEGM
|
|
|
static time_t timegm(struct tm *t)
|
|
static time_t timegm(struct tm *t)
|
|
|
{
|
|
{
|
|
|
- time_t tl, tb;
|
|
|
|
|
-
|
|
|
|
|
- tl = mktime (t);
|
|
|
|
|
- if (tl == -1)
|
|
|
|
|
- return -1;
|
|
|
|
|
- tb = mktime (gmtime (&tl));
|
|
|
|
|
- return (tl <= tb ? (tl + (tl - tb)) : (tl - (tb - tl)));
|
|
|
|
|
|
|
+ char *tz = getenv("TZ");
|
|
|
|
|
+ setenv("TZ", "", 1);
|
|
|
|
|
+ tzset();
|
|
|
|
|
+ time_t ret = mktime(t);
|
|
|
|
|
+ if (tz)
|
|
|
|
|
+ setenv("TZ", tz, 1);
|
|
|
|
|
+ else
|
|
|
|
|
+ unsetenv("TZ");
|
|
|
|
|
+ tzset();
|
|
|
|
|
+ return ret;
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
/*}}}*/
|
|
/*}}}*/
|
|
|
|
|
+// FullDateToTime - Converts a HTTP1.1 full date strings into a time_t /*{{{*/
|
|
|
|
|
+// ---------------------------------------------------------------------
|
|
|
|
|
+/* tries to parses a full date as specified in RFC2616 Section 3.3.1
|
|
|
|
|
+ with one exception: All timezones (%Z) are accepted but the protocol
|
|
|
|
|
+ says that it MUST be GMT, but this one is equal to UTC which we will
|
|
|
|
|
+ encounter from time to time (e.g. in Release files) so we accept all
|
|
|
|
|
+ here and just assume it is GMT (or UTC) later on */
|
|
|
|
|
+bool RFC1123StrToTime(const char* const str,time_t &time)
|
|
|
|
|
+{
|
|
|
|
|
+ struct tm Tm;
|
|
|
|
|
+ // Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
|
|
|
|
|
+ if (strptime(str, "%a, %d %b %Y %H:%M:%S %Z", &Tm) == NULL &&
|
|
|
|
|
+ // Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
|
|
|
|
|
+ strptime(str, "%A, %d-%b-%y %H:%M:%S %Z", &Tm) == NULL &&
|
|
|
|
|
+ // Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
|
|
|
|
|
+ strptime(str, "%a %b %d %H:%M:%S %Y", &Tm) == NULL)
|
|
|
|
|
+ return false;
|
|
|
|
|
+
|
|
|
|
|
+ time = timegm(&Tm);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+ /*}}}*/
|
|
|
|
|
+// FTPMDTMStrToTime - Converts a ftp modification date into a time_t /*{{{*/
|
|
|
|
|
+// ---------------------------------------------------------------------
|
|
|
|
|
+/* */
|
|
|
|
|
+bool FTPMDTMStrToTime(const char* const str,time_t &time)
|
|
|
|
|
+{
|
|
|
|
|
+ struct tm Tm;
|
|
|
|
|
+ // MDTM includes no whitespaces but recommend and ignored by strptime
|
|
|
|
|
+ if (strptime(str, "%Y %m %d %H %M %S", &Tm) == NULL)
|
|
|
|
|
+ return false;
|
|
|
|
|
+
|
|
|
|
|
+ time = timegm(&Tm);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+ /*}}}*/
|
|
|
// StrToTime - Converts a string into a time_t /*{{{*/
|
|
// StrToTime - Converts a string into a time_t /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------
|
|
|
/* This handles all 3 populare time formats including RFC 1123, RFC 1036
|
|
/* This handles all 3 populare time formats including RFC 1123, RFC 1036
|