Commit 2eb2f2e6 authored by Mihai Moldovan's avatar Mihai Moldovan

nxcomp/src/Timestamp.{cpp,h}: use ::ctime_s or ::ctime_r instead of plain ctime,…

nxcomp/src/Timestamp.{cpp,h}: use ::ctime_s or ::ctime_r instead of plain ctime, on-stack buffers and return std::string objects. Fixes: ArcticaProject/nx-libs#616
parent df8908b9
...@@ -44,34 +44,55 @@ ...@@ -44,34 +44,55 @@
T_timestamp timestamp; T_timestamp timestamp;
// std::string strTimestamp(const T_timestamp &ts)
// The following functions all use the ctime
// static buffer from the C library.
//
char *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, snprintf(ctime_new, sizeof(ctime_new), "%.8s:%3.3f",
(float) ts.tv_usec / 1000); 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 @@ ...@@ -26,11 +26,17 @@
#ifndef Timestamp_H #ifndef Timestamp_H
#define 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 <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <iostream>
#include <string>
#include <time.h>
#include <sys/time.h> #include <sys/time.h>
#include "Misc.h" #include "Misc.h"
...@@ -260,15 +266,15 @@ inline int checkDiffTimestamp(const T_timestamp &ts1, const T_timestamp &ts2, ...@@ -260,15 +266,15 @@ inline int checkDiffTimestamp(const T_timestamp &ts1, const T_timestamp &ts2,
// Return a string representing the timestamp. // Return a string representing the timestamp.
// //
char *strTimestamp(const T_timestamp &ts); std::string strTimestamp(const T_timestamp &ts);
char *strMsTimestamp(const T_timestamp &ts); std::string strMsTimestamp(const T_timestamp &ts);
inline char *strTimestamp() inline std::string strTimestamp()
{ {
return strTimestamp(getTimestamp()); return strTimestamp(getTimestamp());
} }
inline char *strMsTimestamp() inline std::string strMsTimestamp()
{ {
return strMsTimestamp(getTimestamp()); 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