timedated: expose time and NTP sync flag via the bus
authorLennart Poettering <lennart@poettering.net>
Wed, 16 Oct 2013 23:03:39 +0000 (01:03 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 16 Oct 2013 23:03:39 +0000 (01:03 +0200)
This way, timedatectl can be run over the network and determine all
properties correctly from the server rather than the client.

src/shared/time-util.c
src/shared/time-util.h
src/timedate/timedatectl.c
src/timedate/timedated.c

index 860be61..4b4cd7a 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <time.h>
 #include <string.h>
+#include <sys/timex.h>
 
 #include "util.h"
 #include "time-util.h"
@@ -792,3 +793,15 @@ int parse_nsec(const char *t, nsec_t *nsec) {
 
         return 0;
 }
+
+bool ntp_synced(void) {
+        struct timex txc = {};
+
+        if (adjtimex(&txc) < 0)
+                return false;
+
+        if (txc.status & STA_UNSYNC)
+                return false;
+
+        return true;
+}
index 7660fe1..a51317d 100644 (file)
@@ -84,3 +84,5 @@ int parse_timestamp(const char *t, usec_t *usec);
 
 int parse_sec(const char *t, usec_t *usec);
 int parse_nsec(const char *t, nsec_t *nsec);
+
+bool ntp_synced(void);
index 141180c..80afc57 100644 (file)
@@ -72,18 +72,6 @@ typedef struct StatusInfo {
         bool can_ntp;
 } StatusInfo;
 
-static bool ntp_synced(void) {
-        struct timex txc = {};
-
-        if (adjtimex(&txc) < 0)
-                return false;
-
-        if (txc.status & STA_UNSYNC)
-                return false;
-
-        return true;
-}
-
 static const char *jump_str(int delta_minutes, char *s, size_t size) {
         if (delta_minutes == 60)
                 return "one hour forward";
index 16e24c1..48c6a13 100644 (file)
@@ -481,6 +481,42 @@ static int property_get_rtc_time(
         return 1;
 }
 
+static int property_get_time(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                sd_bus_error *error,
+                void *userdata) {
+
+        int r;
+
+        r = sd_bus_message_append(reply, "t", now(CLOCK_REALTIME));
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
+static int property_get_ntp_sync(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                sd_bus_error *error,
+                void *userdata) {
+
+        int r;
+
+        r = sd_bus_message_append(reply, "b", ntp_synced());
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
 static int method_set_timezone(sd_bus *bus, sd_bus_message *m, void *userdata) {
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         Context *c = userdata;
@@ -735,6 +771,8 @@ static const sd_bus_vtable timedate_vtable[] = {
         SD_BUS_PROPERTY("LocalRTC", "b", NULL, offsetof(Context, local_rtc), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("CanNTP", "b", bus_property_get_tristate, offsetof(Context, can_ntp), 0),
         SD_BUS_PROPERTY("NTP", "b", bus_property_get_tristate, offsetof(Context, use_ntp), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("NTPSynchronized", "b", property_get_ntp_sync, 0, 0),
+        SD_BUS_PROPERTY("TimeUSec", "t", property_get_time, 0, 0),
         SD_BUS_PROPERTY("RTCTimeUSec", "t", property_get_rtc_time, 0, 0),
         SD_BUS_METHOD("SetTime", "xbb", NULL, method_set_time, 0),
         SD_BUS_METHOD("SetTimezone", "sb", NULL, method_set_timezone, 0),