Send connman mailing list submissions to
        connman@lists.01.org

To subscribe or unsubscribe via email, send a message with subject or
body 'help' to
        connman-requ...@lists.01.org

You can reach the person managing the list at
        connman-ow...@lists.01.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."

Today's Topics:

   1. RE: [PATCH] clock: Add TimeSynced signal emitted when the system time has 
been synced
      (VAUTRIN Emmanuel (Canal Plus Prestataire))


----------------------------------------------------------------------

Date: Thu, 21 Jan 2021 16:35:38 +0000
From: "VAUTRIN Emmanuel (Canal Plus Prestataire)"
        <emmanuel.vaut...@cpexterne.org>
Subject: RE: [PATCH] clock: Add TimeSynced signal emitted when the
        system time has been synced
To: Daniel Wagner <w...@monom.org>
Cc: "connman@lists.01.org" <connman@lists.01.org>
Message-ID:  <pr1pr02mb4794f6f3d61da849ec8d8f4793...@pr1pr02mb4794.eur
        prd02.prod.outlook.com>
Content-Type: text/plain; charset="iso-8859-1"

Hello,

Finally, after running several campaigns, I faced (rarely) no time update after 
updating the timeservers lists.
It seems to work better with this second version.

>From ced5a1988f5b0e7a44a278b0e270577e6b427f88 Mon Sep 17 00:00:00 2001
From: Emmanuel VAUTRIN <emmanuel.vaut...@cpexterne.org>
Date: Thu, 7 Jan 2021 17:27:39 +0100
Subject: [PATCH v2] clock: Implement Clock API time synchronization

Implement Clock API TimeserverSynced property, which indicates if the
current system time is synced via NTP servers.
Trigger a time synchronization when the TimeUpdate property is set to
auto.
Fix time synchronization when starting with an empty Timeservers list.
Emit a Time PropertyChanged signal on NTP synchronization success.
---
 doc/clock-api.txt |  5 +++++
 src/clock.c       | 15 +++++++++++++++
 src/connman.h     |  3 +++
 src/timeserver.c  | 43 +++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/doc/clock-api.txt b/doc/clock-api.txt
index 6818f5a8..48d29970 100644
--- a/doc/clock-api.txt
+++ b/doc/clock-api.txt
@@ -85,3 +85,8 @@ Properties    uint64 Time [readonly or readwrite]  
[experimental]
 
                        This list of servers is used when TimeUpdates is set
                        to auto.
+
+               boolean TimeserverSynced [readonly]  [experimental]
+
+                       This value indicates if the current system time
+                       is synced via NTP servers.
diff --git a/src/clock.c b/src/clock.c
index 0fde2c34..906538ac 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -173,6 +173,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
 {
        DBusMessage *reply;
        DBusMessageIter array, dict;
+       dbus_bool_t is_synced;
        struct timeval tv;
        const char *str;
 
@@ -210,6 +211,10 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_append_array(&dict, "Timeservers",
                                DBUS_TYPE_STRING, append_timeservers, NULL);
 
+       is_synced = __connman_timeserver_is_synced();
+       connman_dbus_dict_append_basic(&dict, "TimeserverSynced",
+                                       DBUS_TYPE_BOOLEAN, &is_synced);
+
        connman_dbus_dict_close(&array, &dict);
 
        return reply;
@@ -258,6 +263,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                if (settimeofday(&tv, NULL) < 0)
                        return __connman_error_invalid_arguments(msg);
 
+               __connman_timeserver_set_synced(false);
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "Time",
                                DBUS_TYPE_UINT64, &newval);
@@ -283,6 +289,13 @@ static DBusMessage *set_property(DBusConnection *conn,
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "TimeUpdates",
                                DBUS_TYPE_STRING, &strval);
+
+               if (newval == TIME_UPDATES_AUTO) {
+                       struct connman_service *service;
+
+                       service = connman_service_get_default();
+                       __connman_timeserver_conf_update(service);
+               }
        } else if (g_str_equal(name, "Timezone")) {
                const char *strval;
 
@@ -362,6 +375,8 @@ static DBusMessage *set_property(DBusConnection *conn,
                connman_dbus_property_changed_array(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "Timeservers",
                                DBUS_TYPE_STRING, append_timeservers, NULL);
+       } else if (g_str_equal(name, "TimeserverSynced")) {
+               return __connman_error_permission_denied(msg);
        } else
                return __connman_error_invalid_property(msg);
 
diff --git a/src/connman.h b/src/connman.h
index e51d94d0..50d52bbe 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -452,6 +452,9 @@ GSList *__connman_timeserver_get_all(struct connman_service 
*service);
 void __connman_timeserver_sync(struct connman_service *service);
 void __connman_timeserver_conf_update(struct connman_service *service);
 
+bool __connman_timeserver_is_synced(void);
+void __connman_timeserver_set_synced(bool status);
+
 enum __connman_dhcpv6_status {
        CONNMAN_DHCPV6_STATUS_FAIL     = 0,
        CONNMAN_DHCPV6_STATUS_SUCCEED  = 1,
diff --git a/src/timeserver.c b/src/timeserver.c
index 5f0aca68..2675113b 100644
--- a/src/timeserver.c
+++ b/src/timeserver.c
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <gweb/gresolv.h>
 #include <netdb.h>
+#include <sys/time.h>
 
 #include "connman.h"
 
@@ -40,6 +41,7 @@ static GSList *ts_list = NULL;
 static char *ts_current = NULL;
 static int ts_recheck_id = 0;
 static int ts_backoff_id = 0;
+static bool ts_is_synced = false;
 
 static GResolv *resolv = NULL;
 static int resolv_id = 0;
@@ -55,8 +57,24 @@ static void ntp_callback(bool success, void *user_data)
 {
        DBG("success %d", success);
 
+       __connman_timeserver_set_synced(success);
        if (!success)
                sync_next();
+       else {
+               struct timeval tv;
+
+               if (gettimeofday(&tv, NULL) == 0) {
+                       dbus_uint64_t timestamp;
+
+                       timestamp = tv.tv_sec;
+                       connman_dbus_property_changed_basic(
+                                       CONNMAN_MANAGER_PATH,
+                                       CONNMAN_CLOCK_INTERFACE, "Time",
+                                       DBUS_TYPE_UINT64, &timestamp);
+               } else {
+                       connman_warn("Failed to get current time");
+               }
+       }
 }
 
 static void save_timeservers(char **servers)
@@ -337,6 +355,8 @@ static void ts_reset(struct connman_service *service)
        if (!resolv)
                return;
 
+       __connman_timeserver_set_synced(false);
+
        /*
         * Before we start creating the new timeserver list we must stop
         * any ongoing ntp query and server resolution.
@@ -366,6 +386,8 @@ static void ts_reset(struct connman_service *service)
 
        __connman_service_timeserver_changed(service, timeservers_list);
 
+       ts_service = service;
+
        if (!timeservers_list) {
                DBG("No timeservers set.");
                return;
@@ -373,7 +395,6 @@ static void ts_reset(struct connman_service *service)
 
        ts_recheck_enable();
 
-       ts_service = service;
        timeserver_sync_start();
 }
 
@@ -394,6 +415,24 @@ void __connman_timeserver_conf_update(struct 
connman_service *service)
 }
 
 
+bool __connman_timeserver_is_synced(void)
+{
+       return ts_is_synced;
+}
+
+void __connman_timeserver_set_synced(bool status)
+{
+       if (ts_is_synced != status) {
+               dbus_bool_t is_synced;
+
+               ts_is_synced = status;
+               is_synced = status;
+               connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
+                               CONNMAN_CLOCK_INTERFACE, "TimeserverSynced",
+                               DBUS_TYPE_BOOLEAN, &is_synced);
+       }
+}
+
 static int timeserver_start(struct connman_service *service)
 {
        char **nameservers;
@@ -467,7 +506,7 @@ int __connman_timeserver_system_set(char **servers)
        save_timeservers(servers);
 
        service = connman_service_get_default();
-       __connman_timeserver_conf_update(service);
+       ts_reset(service);
 
        return 0;
 }
-- 
2.25.1



B.R.

Emmanuel

------------------------------

Subject: Digest Footer

_______________________________________________
connman mailing list -- connman@lists.01.org
To unsubscribe send an email to connman-le...@lists.01.org


------------------------------

End of connman Digest, Vol 63, Issue 8
**************************************

Reply via email to