diff options
author | Mihai Moldovan <ionic@ionic.de> | 2018-01-09 01:08:17 +0100 |
---|---|---|
committer | Mihai Moldovan <ionic@ionic.de> | 2018-01-09 01:08:17 +0100 |
commit | 1086c4aa5b4ad65bb51dac1dbab606f14ebaf98b (patch) | |
tree | 1365ea718d79998976bfab487b596ef48ce34b0c /nxcomp | |
parent | 70e1e6a011126aa027456ad4b3163f67d72c034f (diff) | |
parent | 2eb2f2e6ca13d84113e30041ade2dbfa9f4e1432 (diff) | |
download | nx-libs-1086c4aa5b4ad65bb51dac1dbab606f14ebaf98b.tar.gz nx-libs-1086c4aa5b4ad65bb51dac1dbab606f14ebaf98b.tar.bz2 nx-libs-1086c4aa5b4ad65bb51dac1dbab606f14ebaf98b.zip |
Merge branch 'Ionic-bugfix/ctime' into 3.6.x
Attributes GH PR #623: https://github.com/ArcticaProject/nx-libs/pull/623
Fixes: ArcticaProject/nx-libs#616
Diffstat (limited to 'nxcomp')
-rw-r--r-- | nxcomp/configure.ac | 17 | ||||
-rw-r--r-- | nxcomp/src/Timestamp.cpp | 55 | ||||
-rw-r--r-- | nxcomp/src/Timestamp.h | 16 |
3 files changed, 66 insertions, 22 deletions
diff --git a/nxcomp/configure.ac b/nxcomp/configure.ac index 12c3b5004..b7350a45e 100644 --- a/nxcomp/configure.ac +++ b/nxcomp/configure.ac @@ -94,6 +94,23 @@ std::tm tm = *std::localtime(&t); [Use std::put_time to format times, must be made available by the compiler if turned on.])], [AC_MSG_RESULT([no])]) +# Check if ::ctime_s is available. +AC_MSG_CHECKING([if ::ctime_s is available]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM( +[[ +#define __STDC_WANT_LIB_EXT1__ 1 +#include <ctime> +]], +[[ +time_t res = time(NULL); +char str[26] = { }; +::ctime_s(str, sizeof(str), &res); +]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_CTIME_S, [1], + [Use ::ctime_s to format times, must be made available by the compiler if turned on.])], + [AC_MSG_RESULT([no])]) + AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [enable to get info session log output (disabled by default)])], diff --git a/nxcomp/src/Timestamp.cpp b/nxcomp/src/Timestamp.cpp index e7e0c494a..4a9dd3347 100644 --- a/nxcomp/src/Timestamp.cpp +++ b/nxcomp/src/Timestamp.cpp @@ -44,34 +44,55 @@ T_timestamp timestamp; -// -// The following functions all use the ctime -// static buffer from the C library. -// - -char *strTimestamp(const T_timestamp &ts) +std::string strTimestamp(const T_timestamp &ts) { - char *ctime_now = ctime((time_t *) &ts.tv_sec); + std::string ret; + + char ctime_now[26] = { }; + bool err = true; - ctime_now[24] = '\0'; +#if HAVE_CTIME_S + errno_t retval = ::ctime_s(ctime_now, sizeof(ctime_now), static_cast<const time_t*>(&ts.tv_sec)); - return ctime_now; + if (retval != 0) +#else + char *retval = ::ctime_r(static_cast<const time_t*>(&ts.tv_sec), ctime_now); + + if (!(retval)) +#endif + { + std::cerr << "WARNING: converting time to string failed." << std::endl; + } + else + { + /* Replace newline at position 25 with a NULL byte. */ + ctime_now[24] = '\0'; + + ret = ctime_now; + } + + return ret; } // -// This is especially dirty. +// This is especially dirty. // -char *strMsTimestamp(const T_timestamp &ts) +std::string strMsTimestamp(const T_timestamp &ts) { - char *ctime_now = ctime((time_t *) &ts.tv_sec); + std::string ret; + + std::string ctime_now = strTimestamp(ts); - char ctime_new[25]; + if (!(ctime_now.empty())) + { + char ctime_new[26] = { }; - sprintf(ctime_new, "%.8s:%3.3f", ctime_now + 11, - (float) ts.tv_usec / 1000); + snprintf(ctime_new, sizeof(ctime_new), "%.8s:%3.3f", + ctime_now.c_str() + 11, static_cast<float>(ts.tv_usec) / 1000); - strncpy(ctime_now, ctime_new, 24); + ret = ctime_new; + } - return ctime_now; + return ret; } diff --git a/nxcomp/src/Timestamp.h b/nxcomp/src/Timestamp.h index bb9b243db..9e6fafcfd 100644 --- a/nxcomp/src/Timestamp.h +++ b/nxcomp/src/Timestamp.h @@ -26,11 +26,17 @@ #ifndef Timestamp_H #define Timestamp_H +#if HAVE_CTIME_S +#define __STDC_WANT_LIB_EXT1__ 1 +#include <time.h> +#endif /* HAVE_CTIME_S */ + #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <iostream> +#include <string> -#include <time.h> #include <sys/time.h> #include "Misc.h" @@ -260,15 +266,15 @@ inline int checkDiffTimestamp(const T_timestamp &ts1, const T_timestamp &ts2, // Return a string representing the timestamp. // -char *strTimestamp(const T_timestamp &ts); -char *strMsTimestamp(const T_timestamp &ts); +std::string strTimestamp(const T_timestamp &ts); +std::string strMsTimestamp(const T_timestamp &ts); -inline char *strTimestamp() +inline std::string strTimestamp() { return strTimestamp(getTimestamp()); } -inline char *strMsTimestamp() +inline std::string strMsTimestamp() { return strMsTimestamp(getTimestamp()); } |