diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-06-21 16:07:28 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-06-21 16:07:28 +0200 |
| commit | cbbefae2849b9f7df8d4e41f1e535d5419799a82 (patch) | |
| tree | f65ba846cabd80403654b685a484b643d2236339 /src/timedate.cpp | |
| parent | 6fc7f86a89dbcbe1e36ade37c61d4a974be81596 (diff) | |
| download | slack-timedate-cbbefae2849b9f7df8d4e41f1e535d5419799a82.tar.gz | |
Add the NTPSynchronized property
Diffstat (limited to 'src/timedate.cpp')
| -rw-r--r-- | src/timedate.cpp | 64 |
1 files changed, 40 insertions, 24 deletions
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 <fstream> #include <iostream> #include <string> - +#include <sys/timex.h> #include "timedate.h" static void slack_method_call(const Glib::RefPtr<Gio::DBus::Connection>& connection, const Glib::ustring& sender, @@ -121,6 +121,10 @@ static void slack_get_property(Glib::VariantBase& result, const Glib::RefPtr<Gio { result = Glib::Variant<bool>::create(dlackware::timedate::can_ntp()); } + else if (prop_name == "NTPSynchronized") + { + result = Glib::Variant<bool>::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<time_t>(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<time_t>(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; - - if (relative) - { - if (clock_gettime(CLOCK_REALTIME, &ts) == -1) - { - throw std::system_error(errno, std::generic_category()); - } - ts.tv_sec += static_cast<time_t>(seconds_since_epoch / dlackware::timedate::usec_per_sec); - ts.tv_nsec += (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; + timex buffer{ .modes = 0 }; + int ntp_result = ntp_adjtime(&buffer); - if (ts.tv_nsec < 0) - { - --ts.tv_sec; - ts.tv_nsec += dlackware::timedate::usec_per_sec; - } - } - else - { - ts.tv_sec = static_cast<time_t>(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; } } |
