OSDN Git Service

Use bool type in fetch_next_entry().
[android-x86/external-exfat.git] / libexfat / time.c
index e91ec48..43c5fa4 100644 (file)
@@ -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-2013  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,
        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 <http://www.gnu.org/licenses/>.
+       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,12 @@ 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;
+
+       tzset();
+       now = time(NULL);
+       exfat_timezone = mktime(gmtime(&now)) - now;
+}