#ifndef TIMESTAMP_H__ #define TIMESTAMP_H__ #include #include #include"Config.h" #include "Log.h" namespace i2p { namespace util { constexpr char NTPMaxTimeConnecting = 15; extern int64_t g_TimeOffset; // in seconds enum class TimeType{ milliseconds, seconds, hours }; template inline uint64_t getTime(void) { return std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count (); } template auto getTime(TimeType tt) -> decltype(getTime()){ LogPrint (eLogDebug, "I2Pd Time Correcting: offset = ", g_TimeOffset ); bool Time_Correcting, Time_UseNTP; i2p::config::GetOption("time.correcting", Time_Correcting); i2p::config::GetOption("time.use_ntp", Time_UseNTP); if(Time_Correcting || Time_UseNTP) LogPrint (eLogDebug, "I2Pd Time Correcting: Return time with offset ", getTime() + g_TimeOffset ); else LogPrint(eLogDebug, "I2Pd Time Correcting: return real time"); if(Time_Correcting || Time_UseNTP){ auto tmpTime = getTime() ; switch(tt){ case TimeType::milliseconds: return tmpTime+g_TimeOffset*1000; case TimeType::seconds: return tmpTime+g_TimeOffset; break; case TimeType::hours: if(tmpTime) return tmpTime + g_TimeOffset/120; break; } } return getTime(); } bool timeCorrecting(uint32_t signedOnTime, uint32_t ts, uint32_t skew, const char * ErrorMsg); bool SyncTimeWithNTP (void); inline uint64_t GetSecondsSinceEpoch () { return getTime(); } inline uint64_t GetMillisecondsSinceEpoch () { return getTime(); } inline uint32_t GetHoursSinceEpoch () { return getTime(); } } } #endif