From cbbefae2849b9f7df8d4e41f1e535d5419799a82 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 21 Jun 2024 16:07:28 +0200 Subject: [PATCH] Add the NTPSynchronized property --- data/org.freedesktop.timedate1.xml | 1 + src/timedate.cpp | 64 +++++++++++++++++++----------- src/timedate.h | 3 ++ 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/data/org.freedesktop.timedate1.xml b/data/org.freedesktop.timedate1.xml index b64f9e5..c0ffaa1 100644 --- a/data/org.freedesktop.timedate1.xml +++ b/data/org.freedesktop.timedate1.xml @@ -6,6 +6,7 @@ + diff --git a/src/timedate.cpp b/src/timedate.cpp index 101a925..aed13f5 100644 --- a/src/timedate.cpp +++ b/src/timedate.cpp @@ -20,7 +20,7 @@ #include #include #include - +#include #include "timedate.h" static void slack_method_call(const Glib::RefPtr& connection, const Glib::ustring& sender, @@ -121,6 +121,10 @@ static void slack_get_property(Glib::VariantBase& result, const Glib::RefPtr::create(dlackware::timedate::can_ntp()); } + else if (prop_name == "NTPSynchronized") + { + result = Glib::Variant::create(dlackware::timedate::ntp_synchronized()); + } } namespace dlackware::timedate @@ -243,6 +247,36 @@ namespace dlackware::timedate } } + void set_time(gint64 seconds_since_epoch, bool relative, bool) + { + timespec ts; + + if (relative) + { + if (clock_gettime(CLOCK_REALTIME, &ts) == -1) + { + throw std::system_error(errno, std::generic_category()); + } + ts.tv_sec += static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); + ts.tv_nsec += (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; + + if (ts.tv_nsec < 0) + { + --ts.tv_sec; + ts.tv_nsec += dlackware::timedate::usec_per_sec; + } + } + else + { + ts.tv_sec = static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); + ts.tv_nsec = (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; + } + if (clock_settime(CLOCK_REALTIME, &ts) == -1) + { + throw std::system_error(errno, std::generic_category()); + } + } + bool local_rtc() { std::ifstream fh{ "/etc/hardwareclock", std::ios::in }; @@ -288,33 +322,15 @@ namespace dlackware::timedate return wait_status == 0 && standard_output == "bundle\n"; } - void set_time(gint64 seconds_since_epoch, bool relative, bool) + bool ntp_synchronized() { - timespec ts; + timex buffer{ .modes = 0 }; + int ntp_result = ntp_adjtime(&buffer); - if (relative) - { - if (clock_gettime(CLOCK_REALTIME, &ts) == -1) - { - throw std::system_error(errno, std::generic_category()); - } - ts.tv_sec += static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); - ts.tv_nsec += (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; - - if (ts.tv_nsec < 0) - { - --ts.tv_sec; - ts.tv_nsec += dlackware::timedate::usec_per_sec; - } - } - else - { - ts.tv_sec = static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); - ts.tv_nsec = (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; - } - if (clock_settime(CLOCK_REALTIME, &ts) == -1) + if (ntp_result == -1) { throw std::system_error(errno, std::generic_category()); } + return ntp_result != TIME_ERROR && (buffer.status & STA_UNSYNC) == 0; } } diff --git a/src/timedate.h b/src/timedate.h index 40f149a..2b2d1a2 100644 --- a/src/timedate.h +++ b/src/timedate.h @@ -40,6 +40,9 @@ namespace dlackware::timedate // Returns whether NTP is available. bool can_ntp(); + // Shows whether the kernel reports the time as synchronized. + bool ntp_synchronized(); + // Returns the timezones available on the system. std::vector list_timezones();