diff options
author | des <des@FreeBSD.org> | 2000-05-11 16:01:03 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 2000-05-11 16:01:03 +0000 |
commit | 741229b49addd41eaacd4eb37f23983dfb812c8d (patch) | |
tree | d31bff61fed5ce973fc8ecad4398ddf97ba5ed58 /lib/libfetch/ftp.c | |
parent | 8e84288c328cfe3b45457b1a2eac93658e0a5379 (diff) | |
download | FreeBSD-src-741229b49addd41eaacd4eb37f23983dfb812c8d.zip FreeBSD-src-741229b49addd41eaacd4eb37f23983dfb812c8d.tar.gz |
Add workaround for ftpds with the Y2K MDTM bug
Diffstat (limited to 'lib/libfetch/ftp.c')
-rw-r--r-- | lib/libfetch/ftp.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c index 3426f8c..0e13bf5 100644 --- a/lib/libfetch/ftp.c +++ b/lib/libfetch/ftp.c @@ -561,25 +561,40 @@ fetchStatFTP(struct url *url, struct url_stat *us, char *flags) _ftp_seterr(999); return -1; } + DEBUG(fprintf(stderr, "size: [\033[1m%lld\033[m]\n", us->size)); if ((e = _ftp_cmd(cd, "MDTM %s", s)) != FTP_FILE_STATUS) goto ouch; for (ln = last_reply + 4; *ln && isspace(*ln); ln++) /* nothing */ ; - sscanf(ln, "%04d%02d%02d%02d%02d%02d", - &tm.tm_year, &tm.tm_mon, &tm.tm_mday, - &tm.tm_hour, &tm.tm_min, &tm.tm_sec); - /* XXX should check the return value from sscanf */ + e = 999; + switch (strspn(ln, "0123456789")) { + case 14: + break; + case 15: + ln++; + ln[0] = '2'; + ln[1] = '0'; + break; + default: + goto ouch; + } + if (sscanf(ln, "%04d%02d%02d%02d%02d%02d", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, + &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) + goto ouch; tm.tm_mon--; tm.tm_year -= 1900; tm.tm_isdst = -1; - t = mktime(&tm); + t = timegm(&tm); if (t == (time_t)-1) t = time(NULL); - else - t += tm.tm_gmtoff; us->mtime = t; us->atime = t; + DEBUG(fprintf(stderr, "last modified: [\033[1m%04d-%02d-%02d " + "%02d:%02d:%02d\033[m]\n", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec)); return 0; ouch: |