From a0c7dc4f46e1991fb622f3ff2dc5bee18c0369e1 Mon Sep 17 00:00:00 2001 From: oetiker Date: Tue, 24 Jan 2012 08:18:37 +0000 Subject: [PATCH] test for tm.tm_gmtoff presence in configure.ac fix for #330 git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4@2265 a5681a0c-68f1-0310-ab6d-d61299d08faa --- program/configure.ac | 2 ++ program/m4/acinclude.m4 | 65 ++++++++++++++++++++++++++++++++++ program/src/rrd_fetch_libdbi.c | 13 +++++-- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/program/configure.ac b/program/configure.ac index 63bff731..6d281906 100644 --- a/program/configure.ac +++ b/program/configure.ac @@ -352,6 +352,8 @@ AC_FULL_IEEE CONFIGURE_PART(Resolve Portability Issues) +GC_TIMEZONE() + CHECK_FOR_WORKING_MS_ASYNC dnl do we have nl_langinfo(_NL_TIME_WEEK_1STDAY) diff --git a/program/m4/acinclude.m4 b/program/m4/acinclude.m4 index 4ada9197..e12477f2 100644 --- a/program/m4/acinclude.m4 +++ b/program/m4/acinclude.m4 @@ -545,3 +545,68 @@ fi ]) +dnl idea taken from the autoconf mailing list, posted by +dnl Timur I. Bakeyev timur@gnu.org, +dnl http://mail.gnu.org/pipermail/autoconf/1999-October/008311.html +dnl partly rewritten by Peter Stamfest + +dnl This determines, if struct tm containes tm_gmtoff field +dnl or we should use extern long int timezone. + +dnl Add the following to your acconfig.h: + +dnl /* Define if your struct tm has tm_gmtoff. */ +dnl #undef HAVE_TM_GMTOFF +dnl #undef TM_GMTOFF +dnl +dnl /* Define if you don't have tm_gmtoff but do have the external timezone. */ +dnl #undef HAVE_TIMEZONE + +AC_DEFUN([GC_TIMEZONE], [ + AC_REQUIRE([AC_STRUCT_TM]) + AC_CACHE_CHECK([tm_gmtoff in struct tm], gq_cv_have_tm_gmtoff, + gq_cv_have_tm_gmtoff=no + AC_TRY_COMPILE([#include + #include <$ac_cv_struct_tm> + ], + [struct tm t; + t.tm_gmtoff = 0; + exit(0); + ], + gq_cv_have_tm_gmtoff=yes + ) + ) + + AC_CACHE_CHECK([__tm_gmtoff in struct tm], gq_cv_have___tm_gmtoff, + gq_cv_have___tm_gmtoff=no + AC_TRY_COMPILE([#include + #include <$ac_cv_struct_tm> + ], + [struct tm t; + t.__tm_gmtoff = 0; + exit(0); + ], + gq_cv_have___tm_gmtoff=yes + ) + ) + + if test "$gq_cv_have_tm_gmtoff" = yes ; then + AC_DEFINE(HAVE_TM_GMTOFF,1,[does tm have a tm_gmtoff member]) + AC_DEFINE(TM_GMTOFF, tm_gmtoff,[the real name of tm_gmtoff]) + elif test "$gq_cv_have___tm_gmtoff" = yes ; then + AC_DEFINE(HAVE_TM_GMTOFF) + AC_DEFINE(TM_GMTOFF, __tm_gmtoff) + else + AC_CACHE_CHECK(for timezone, ac_cv_var_timezone, + [AC_TRY_LINK([ + #include + extern long int timezone; + ], + [long int l = timezone;], + ac_cv_var_timezone=yes, + ac_cv_var_timezone=no)]) + if test $ac_cv_var_timezone = yes; then + AC_DEFINE(HAVE_TIMEZONE,1,[is there an external timezone variable instead ?]) + fi + fi +]) diff --git a/program/src/rrd_fetch_libdbi.c b/program/src/rrd_fetch_libdbi.c index 21fbc083..fe99c702 100644 --- a/program/src/rrd_fetch_libdbi.c +++ b/program/src/rrd_fetch_libdbi.c @@ -1,6 +1,6 @@ #include "rrd_tool.h" #include "unused.h" -#include +// #include #include /* the structures */ @@ -462,9 +462,18 @@ rrd_fetch_fn_libdbi( /* if we have leading '*', then we have a TIMEDATE Field*/ if (table_help.timestamp[0]=='*') { struct tm tm; +#ifdef HAVE_TIMEZONE + extern long timezone; +#endif time_t t=time(NULL); localtime_r(&t,&tm); - gmt_offset=tm.tm_gmtoff; +#ifdef HAVE_TM_GMTOFF + gmt_offset=tm.TM_GMTOFF; +#else +#ifdef HAVE_TIMEZONE + gmt_offset=timezone; +#endif +#endif isunixtime=0; table_help.timestamp++; } /* hex-unescape the value */ -- 2.30.2