X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=libexfat%2Ftime.c;h=3ef99e8dacd8e973c145d50c4be1a390cb7c1ac0;hb=067205878748068833e8facd21af385e3a7693be;hp=e91ec484cab06161d7c6dced7d5bb18b94611fea;hpb=c5da8801bf00afe018df73fb351ec21d5500e3e3;p=android-x86%2Fexternal-exfat.git diff --git a/libexfat/time.c b/libexfat/time.c index e91ec48..3ef99e8 100644 --- a/libexfat/time.c +++ b/libexfat/time.c @@ -2,11 +2,12 @@ time.c (03.02.12) exFAT file system implementation library. - Copyright (C) 2009, 2010 Andrew Nayenko + Free exFAT implementation. + Copyright (C) 2010-2017 Andrew Nayenko - This program is free software: you can redistribute it and/or modify + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or + the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -14,12 +15,17 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "exfat.h" +/* timezone offset from UTC in seconds; positive for western timezones, + negative for eastern ones */ +static long exfat_timezone; + #define SEC_IN_MIN 60ll #define SEC_IN_HOUR (60 * SEC_IN_MIN) #define SEC_IN_DAY (24 * SEC_IN_HOUR) @@ -63,13 +69,13 @@ time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec) if (day == 0 || month == 0 || month > 12) { - exfat_error("bad date %hu-%02hu-%02hu", + exfat_error("bad date %u-%02hu-%02hu", year + EXFAT_EPOCH_YEAR, month, day); return 0; } if (hour > 23 || min > 59 || twosec > 29) { - exfat_error("bad time %hu:%02hu:%02hu", + exfat_error("bad time %hu:%02hu:%02u", hour, min, twosec * 2); return 0; } @@ -94,7 +100,7 @@ time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec) unix_time += centisec / 100; /* exFAT stores timestamps in local time, so we correct it to UTC */ - unix_time += timezone; + unix_time += exfat_timezone; return unix_time; } @@ -102,7 +108,7 @@ time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec) void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time, uint8_t* centisec) { - time_t shift = EPOCH_DIFF_SEC + timezone; + time_t shift = EPOCH_DIFF_SEC + exfat_timezone; uint16_t day, month, year; uint16_t twosec, min, hour; int days; @@ -141,3 +147,18 @@ void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time, if (centisec) *centisec = (unix_time % 2) * 100; } + +void exfat_tzset(void) +{ + time_t now; + struct tm* utc; + + tzset(); + now = time(NULL); + utc = gmtime(&now); + /* gmtime() always sets tm_isdst to 0 because daylight savings never + affect UTC. Setting tm_isdst to -1 makes mktime() to determine whether + summer time is in effect. */ + utc->tm_isdst = -1; + exfat_timezone = mktime(utc) - now; +}