@@ -93,23 +93,24 @@ static time_t gmtoffset_from_ts(time_t time)
/* Generate 03.40 TP-SCTS */
void gsm340_gen_scts(uint8_t *scts, time_t time)
{
- struct tm *tm = gmtime(&time);
-
- *scts++ = gsm411_bcdify(tm->tm_year % 100);
- *scts++ = gsm411_bcdify(tm->tm_mon + 1);
- *scts++ = gsm411_bcdify(tm->tm_mday);
- *scts++ = gsm411_bcdify(tm->tm_hour);
- *scts++ = gsm411_bcdify(tm->tm_min);
- *scts++ = gsm411_bcdify(tm->tm_sec);
-#ifdef HAVE_TM_GMTOFF_IN_TM
- if (tm->tm_gmtoff >= 0)
- *scts++ = gsm411_bcdify(tm->tm_gmtoff/(60*15));
+ struct tm tm;
+ time_t gmtoffset;
+
+ localtime_r(&time, &tm);
+
+ *scts++ = gsm411_bcdify(tm.tm_year % 100);
+ *scts++ = gsm411_bcdify(tm.tm_mon + 1);
+ *scts++ = gsm411_bcdify(tm.tm_mday);
+ *scts++ = gsm411_bcdify(tm.tm_hour);
+ *scts++ = gsm411_bcdify(tm.tm_min);
+ *scts++ = gsm411_bcdify(tm.tm_sec);
+
+ gmtoffset = gmtoffset_from_ts(time);
+
+ if (gmtoffset >= 0)
+ *scts++ = gsm411_bcdify(gmtoffset/(60*15));
else
- *scts++ = gsm411_bcdify(-tm->tm_gmtoff/(60*15)) | 0x08;
-#else
-#warning find a portable way to obtain timezone offset
- *scts++ = 0;
-#endif
+ *scts++ = gsm411_bcdify(-gmtoffset/(60*15)) | 0x08;
}
/* Decode 03.40 TP-SCTS (into utc/gmt timestamp) */
@@ -28,22 +28,10 @@ Result: len(9) data(0e d0 4f 78 d9 2d 9c 0e 01 )
Result: len(12) data(14 d0 4f 78 d9 2d 9c 0e c3 e2 31 19 )
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ UTC
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ Europe/London
-1364691600 -> 31301310000000 -> 1364695200
-Timezone Europe/London failed at ts 1364691600
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ Europe/Berlin
-1364695200 -> 31301320000000 -> 1364698800
-Timezone Europe/Berlin failed at ts 1364695200
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ Europe/Athens
-1364698800 -> 31301330000000 -> 1364702400
-Timezone Europe/Athens failed at ts 1364698800
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ Europe/Moscow
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ Canada/Central
-1362880800 -> 31300120000000 -> 1362884400
-Timezone Canada/Central failed at ts 1362880800
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ America/New_York
-1362880800 -> 31300120000000 -> 1362884400
-Timezone America/New_York failed at ts 1362880800
Testing gsm340_scts(gsm340_gen_scts(ts)) == ts for TZ America/Los_Angeles
-1362880800 -> 31300120000000 -> 1362884400
-Timezone America/Los_Angeles failed at ts 1362880800
OK