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();