diff options
author | Steve French <sfrench@us.ibm.com> | 2006-10-11 05:49:30 +0200 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2006-10-11 05:49:30 +0200 |
commit | 438dd926260f11ff01fc3441ac6dd4c412d20ea4 (patch) | |
tree | a596911eeb08f23ec9b1027bb47e89582ae6edbf /fs/cifs/netmisc.c | |
parent | [CIFS] readdir (ffirst) enablement of accurate timestamps from legacy servers (diff) | |
download | linux-438dd926260f11ff01fc3441ac6dd4c412d20ea4.tar.xz linux-438dd926260f11ff01fc3441ac6dd4c412d20ea4.zip |
[CIFS] Fix leaps year calculation for years after 2100
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/netmisc.c')
-rw-r--r-- | fs/cifs/netmisc.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c index 3d86b31cf2e4..32562d199552 100644 --- a/fs/cifs/netmisc.c +++ b/fs/cifs/netmisc.c @@ -946,6 +946,15 @@ struct timespec cnvrtDosUnixTm(__u16 date, __u16 time) year = sd->Year; days += year * 365; days += (year/4); /* leap year */ + /* generalized leap year calculation is more complex, ie no leap year + for years/100 except for years/400, but since the maximum number for DOS + year is 2**7, the last year is 1980+127, which means we need only + consider 2 special case years, ie the years 2000 and 2100, and only + adjust for the lack of leap year for the year 2100, as 2000 was a + leap year (divisable by 400) */ + if(year >= 120) /* the year 2100 */ + days = days - 1; /* do not count leap year for the year 2100 */ + /* adjust for leap year where we are still before leap day */ days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0); sec += 24 * 60 * 60 * days; |