This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Daniel Willmann dwillmann at sysmocom.deHello Alexander,
On Fri, 2014-03-07 at 21:25, Alexander Chemeris wrote:
> - Support negative timezone offsets decoding.
> - Correctly account timezone offset and artificial offset mktime()
> introduces.
patch seems missing, I included the current one:
> From b8ed8ed29d239693e2b32b62cbac3b2847937b9b Mon Sep 17 00:00:00 2001
> Message-Id: <b8ed8ed29d239693e2b32b62cbac3b2847937b9b.1394648513.git.daniel at totalueberwachung.de>
> From: Alexander Chemeris <Alexander.Chemeris at gmail.com>
> Date: Fri, 7 Mar 2014 21:03:44 +0100
> Subject: [PATCH 1/1] sms: Fix gsm340_scts() to correctly decode absolute valid
> times.
>
> - Support negative timezone offsets decoding.
> - Correctly account timezone offset and artificial offset mktime() introduces.
> ---
> src/gsm/gsm0411_utils.c | 31 +++++++++++++++++++++++--------
> 1 file changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/src/gsm/gsm0411_utils.c b/src/gsm/gsm0411_utils.c
> index bb59a10..e199b6a 100644
> --- a/src/gsm/gsm0411_utils.c
> +++ b/src/gsm/gsm0411_utils.c
> @@ -100,11 +100,13 @@ void gsm340_gen_scts(uint8_t *scts, time_t time)
> time_t gsm340_scts(uint8_t *scts)
> {
> struct tm tm;
> - uint8_t yr = gsm411_unbcdify(*scts++);
> - int ofs;
> + uint8_t yr, tz;
> + int ofs = 0;
Do we need to initialize ofs? It looks like both before and now ofs is
always assigned before use.
> + time_t timestamp;
>
> memset(&tm, 0x00, sizeof(struct tm));
>
> + yr = gsm411_unbcdify(*scts++);
> if (yr <= 80)
> tm.tm_year = 100 + yr;
> else
> @@ -114,15 +116,28 @@ time_t gsm340_scts(uint8_t *scts)
> tm.tm_hour = gsm411_unbcdify(*scts++);
> tm.tm_min = gsm411_unbcdify(*scts++);
> tm.tm_sec = gsm411_unbcdify(*scts++);
> -#ifdef HAVE_TM_GMTOFF_IN_TM
> - tm.tm_gmtoff = gsm411_unbcdify(*scts++) * 15*60;
> -#endif
By deleting the #ifdef here and not adding it below you'll break cygwin
builds. See commit 7c8e2cc7aca1a789bbcf989a14be177d59041959.
> /* according to gsm 03.40 time zone is
> "expressed in quarters of an hour" */
> - ofs = gsm411_unbcdify(*scts++) * 15*60;
> -
> - return mktime(&tm) - ofs;
> + tz = *scts++;
> + ofs = gsm411_unbcdify(tz&0x7f) * 15*60;
> + if (tz&0x80)
> + ofs = -ofs;
> + /* mktime() doesn't tm.tm_gmtoff into account. Instead, it fills this field
doesn't take
> + * with the current timezone. Which means that the resulting time is off
> + * by several hours after that. So here we're setting tm.tm_isdt to -1
> + * to indicate that the tm time is local, but later we subtract the
> + * offset introduced by mktime. */
> + tm.tm_isdst = -1;
> +
> + timestamp = mktime(&tm);
> + if (timestamp < 0)
> + return -1;
> +
> + /* Subtract artificial timezone offset, introduced by mktime() */
> + timestamp = timestamp - ofs + tm.tm_gmtoff;
> +
> + return timestamp;
> }
>
> /* Decode validity period format 'relative'.
> --
> 1.8.4.2
I'm still not convinced that we want to use mktime and tm_gmtoff for the
calculation. There's timegm() which is the inverse of gmtime() which I
think we should use were it's available. Depending on timegm shouldn't
make us and more dependent on some extension than we already are with
tm_gmtoff.
The man page has a note on how to implement a portable version, though
it involves calling setenv (to set TZ to UTC) and I'm not sure we want
to do that in a library.
Additional discussion welcome.
Regards,
Daniel
--
- Daniel Willmann <dwillmann at sysmocom.de> http://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Schivelbeiner Str. 5
* 10439 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Directors: Holger Freyther, Harald Welte