summaryrefslogtreecommitdiff
path: root/src/timedate.cpp
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-06-21 16:07:28 +0200
committerEugen Wissner <belka@caraus.de>2024-06-21 16:07:28 +0200
commitcbbefae2849b9f7df8d4e41f1e535d5419799a82 (patch)
treef65ba846cabd80403654b685a484b643d2236339 /src/timedate.cpp
parent6fc7f86a89dbcbe1e36ade37c61d4a974be81596 (diff)
downloadslack-timedate-cbbefae2849b9f7df8d4e41f1e535d5419799a82.tar.gz
Add the NTPSynchronized property
Diffstat (limited to 'src/timedate.cpp')
-rw-r--r--src/timedate.cpp64
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;
}
}