Note: patch is included!
1. Conversion of Last-Modified time to time_t in http.c works
wrongly when DST is active -- t.tm_isdst should always be 0.
2. mktime_from_utc() from http.c is too complicated.
It's so complicated that "Gurus from CISCO" didn't notice that
the following line:
return (tl <= tb ? (tl + (tl - tb)) : (tl - (tb - tl)));
is equivalent to:
return tl+tl-tb;
This patch contains even more simple solution.
3. Code for FTP timestamps is probably broken too (I haven't reviewed it carefully).
It's unclear to me if the timezone of modification times of files presented by FTP
servers
is UTC
or local. I couldn't find it in any RFC, but I know that my wu-ftpd uses UTC.
4. In case guys from RedHat haven't submitted their patches,
I'd like you to know there are some to make use of in wget-1.6-2.src.rpm.
Artur Zaprzala
Conversion of Last-Modified time to time_t in http.c works
wrongly when DST is active -- t.tm_isdst should always be 0.
mktime_from_utc() from http.c is too complicated.
It's so complicated that Gurus from CISCO didn't notice that
the following line:
return (tl <= tb ? (tl + (tl - tb)) : (tl - (tb - tl)));
is equivalent to:
return tl+tl-tb;
This patch contains even more simple solution.
In case guys from RedHat haven't submitted their patches,
I'd like to tell you there are some in wget-1.6-2.src.rpm.
--- wget-1.6/src/http.c-orig Sun Dec 31 04:47:58 2000
+++ wget-1.6/src/http.c Wed May 2 22:03:28 2001
@@ -1332,18 +1332,13 @@
/* Converts struct tm to time_t, assuming the data in tm is UTC rather
than local timezone (mktime assumes the latter).
- Contributed by Roger Beeman <[EMAIL PROTECTED]>, with the help of
- Mark Baushke <[EMAIL PROTECTED]> and the rest of the Gurus at CISCO. */
+ Contributed by Artur Zaprzala <[EMAIL PROTECTED]>. */
static time_t
mktime_from_utc (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)));
+ time_t tt = mktime(t);
+ if (tt == -1) return -1;
+ return tt-timezone; /* mktime assumes localtime, so we need to adjust */
}
/* Check whether the result of strptime() indicates success.
@@ -1398,10 +1393,8 @@
needs initialization is tm_isdst, since the others will be set by
strptime. Since strptime does not set tm_isdst, it will return
the data structure with whatever data was in tm_isdst to begin
- with. For those of us in timezones where DST can occur, there
- can be a one hour shift depending on the previous contents of the
- data area where the data structure is allocated." */
- t.tm_isdst = -1;
+ with. Timestamp is in UTC, so DST does not occur." */
+ t.tm_isdst = 0;
/* Note that under foreign locales Solaris strptime() fails to
recognize English dates, which renders this function useless. I