aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMihai Moldovan <ionic@ionic.de>2018-01-09 01:08:17 +0100
committerMihai Moldovan <ionic@ionic.de>2018-01-09 01:08:17 +0100
commit1086c4aa5b4ad65bb51dac1dbab606f14ebaf98b (patch)
tree1365ea718d79998976bfab487b596ef48ce34b0c
parent70e1e6a011126aa027456ad4b3163f67d72c034f (diff)
parent2eb2f2e6ca13d84113e30041ade2dbfa9f4e1432 (diff)
downloadnx-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
-rw-r--r--nxcomp/configure.ac17
-rw-r--r--nxcomp/src/Timestamp.cpp55
-rw-r--r--nxcomp/src/Timestamp.h16
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());
}