diff options
Diffstat (limited to 'src/timedate.cpp')
| -rw-r--r-- | src/timedate.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/timedate.cpp b/src/timedate.cpp index 42bacf6..e6ec83f 100644 --- a/src/timedate.cpp +++ b/src/timedate.cpp @@ -125,9 +125,13 @@ static void slack_get_property(Glib::VariantBase& result, const Glib::RefPtr<Gio { result = Glib::Variant<bool>::create(dlackware::timedate::ntp_synchronized()); } - else if (prop_name == "TimeUSecRTC") + else if (prop_name == "TimeUSec") { - result = Glib::Variant<std::uint64_t>::create(dlackware::timedate::time_usec_rtc()); + result = Glib::Variant<std::uint64_t>::create(dlackware::timedate::time_usec()); + } + else if (prop_name == "RTCTimeUSec") + { + result = Glib::Variant<std::uint64_t>::create(dlackware::timedate::rtc_time_usec()); } } @@ -338,7 +342,30 @@ namespace dlackware::timedate return ntp_result != TIME_ERROR && (buffer.status & STA_UNSYNC) == 0; } - std::uint64_t time_usec_rtc() + std::uint64_t time_usec() + { + timespec spec; + + if (clock_gettime(CLOCK_REALTIME, &spec) == -1) + { + throw std::system_error(errno, std::generic_category()); + } + time_t seconds = spec.tv_sec; + tm time; + + if (local_rtc()) + { + gmtime_r(&seconds, &time); + } + else + { + localtime_r(&seconds, &time); + } + return std::chrono::duration_cast<std::chrono::microseconds>( + std::chrono::seconds(std::mktime(&time)) + std::chrono::nanoseconds(spec.tv_nsec)).count(); + } + + std::uint64_t rtc_time_usec() { return std::chrono::duration_cast<std::chrono::microseconds>( std::chrono::system_clock::now().time_since_epoch()).count(); |
