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 @@
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;
#if HAVE_CTIME_S
errno_t retval = ::ctime_s(ctime_now, sizeof(ctime_now), static_cast<const time_t*>(&ts.tv_sec));
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';
return ctime_now;
ret = ctime_now;
}
return ret;
}
//
// 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