diff options
author | Harald Welte <laforge@gnumonks.org> | 2012-08-29 16:47:30 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2012-08-29 16:47:30 +0200 |
commit | 7c8e2cc7aca1a789bbcf989a14be177d59041959 (patch) | |
tree | 6c62b671a97cddb8eb96c9d95d4dd8ec7b2461a4 | |
parent | b5372ab110b08b9a2e250a68d484e3c147586b21 (diff) |
libosmogsm: Back-port SMS related fixes from openbsc
This was fixed in 9c3dc90d16a40789081c84e46620f4d66689fec1 of
openbsc.git, after the sms code had been migrated here:
introduce HAVE_TM_GMTOFF_IN_TM
Not all architectures have the tm.tm_gmtoff member. This fixes cygwin builds.
-rw-r--r-- | configure.ac | 25 | ||||
-rw-r--r-- | src/gsm/gsm0411_utils.c | 11 |
2 files changed, 35 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 3e88a1b0..ca98fc2c 100644 --- a/configure.ac +++ b/configure.ac @@ -39,6 +39,31 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])], CFLAGS="$saved_CFLAGS" AC_SUBST(SYMBOL_VISIBILITY) +AC_DEFUN([CHECK_TM_INCLUDES_TM_GMTOFF], [ + AC_CACHE_CHECK( + [whether struct tm has tm_gmtoff member], + osmo_cv_tm_includes_tm_gmtoff, + [AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + #include <time.h> + ], [ + time_t t = time(NULL); + struct tm* lt = localtime(&t); + int off = lt->tm_gmtoff; + ]) + ], + osmo_cv_tm_includes_tm_gmtoff=yes, + osmo_cv_tm_includes_tm_gmtoff=no + )] + ) + if test "x$osmo_cv_tm_includes_tm_gmtoff" = xyes; then + AC_DEFINE(HAVE_TM_GMTOFF_IN_TM, 1, + [Define if struct tm has tm_gmtoff member.]) + fi +]) + +CHECK_TM_INCLUDES_TM_GMTOFF + dnl Generate the output AM_CONFIG_HEADER(config.h) diff --git a/src/gsm/gsm0411_utils.c b/src/gsm/gsm0411_utils.c index 5076ec82..ebde8fca 100644 --- a/src/gsm/gsm0411_utils.c +++ b/src/gsm/gsm0411_utils.c @@ -25,6 +25,7 @@ * */ +#include "../../config.h" #include <time.h> #include <string.h> @@ -80,7 +81,12 @@ void gsm340_gen_scts(uint8_t *scts, time_t time) *scts++ = gsm411_bcdify(tm->tm_hour); *scts++ = gsm411_bcdify(tm->tm_min); *scts++ = gsm411_bcdify(tm->tm_sec); - *scts++ = gsm411_bcdify(0); /* GMT */ +#ifdef HAVE_TM_GMTOFF_IN_TM + *scts++ = gsm411_bcdify(tm->tm_gmtoff/(60*15)); +#else +#warning find a portable way to obtain timezone offset + *scts++ = 0; +#endif } /* Decode 03.40 TP-SCTS (into utc/gmt timestamp) */ @@ -101,6 +107,9 @@ 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 /* according to gsm 03.40 time zone is "expressed in quarters of an hour" */ |