Unverified Commit 1086c4aa authored by Mihai Moldovan's avatar Mihai Moldovan

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
parents 70e1e6a0 2eb2f2e6
......@@ -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)])],
......
......@@ -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;
}
......@@ -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());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment