Register with system bus in container environment
[platform/upstream/connman.git] / src / ntp.c
old mode 100644 (file)
new mode 100755 (executable)
index e7fee22..0de4df7
--- a/src/ntp.c
+++ b/src/ntp.c
@@ -253,7 +253,9 @@ static void decode_msg(struct ntp_data *nd, void *base, size_t len,
        double m_delta, org, rec, xmt, dst;
        double delay, offset;
        static guint transmit_delay;
+#if !defined TIZEN_EXT
        struct timex tmx = {};
+#endif
 
        if (len < sizeof(*msg)) {
                connman_error("Invalid response from time server");
@@ -347,6 +349,68 @@ static void decode_msg(struct ntp_data *nd, void *base, size_t len,
 
        nd->poll_id = g_timeout_add_seconds(transmit_delay, next_poll, nd);
 
+#if defined TIZEN_EXT
+       //send the dbus message to alram-manager
+       {
+#define TIME_BUS_NAME "org.tizen.alarm.manager"
+#define TIME_INTERFACE "org.tizen.alarm.manager"
+#define TIME_PATH "/org/tizen/alarm/manager"
+#define TIME_METHOD "alarm_set_time_with_propagation_delay"
+
+               struct timespec cur = {0};
+               struct timespec req = {0};
+               double dtime;
+
+               DBusConnection *connection = NULL;
+               DBusMessage *msg = NULL, *reply = NULL;
+               DBusError error;
+
+               dbus_error_init(&error);
+
+               connection = connman_dbus_get_connection();
+               if(!connection){
+                       DBG("dbus connection does not exist");
+                       return;
+               }
+
+               clock_gettime(CLOCK_REALTIME, &cur);
+               dtime = offset + cur.tv_sec + 1.0e-9 * cur.tv_nsec;
+               cur.tv_sec = (long) dtime;
+               cur.tv_nsec = (dtime - cur.tv_sec) * 1000000000;
+
+               clock_gettime(CLOCK_REALTIME, &req);
+               msg = dbus_message_new_method_call(TIME_BUS_NAME, TIME_PATH,
+                       TIME_INTERFACE, TIME_METHOD);
+               dbus_message_append_args(msg, DBUS_TYPE_INT64, &(cur.tv_sec),
+                       DBUS_TYPE_INT64, &(cur.tv_nsec),
+                       DBUS_TYPE_INT64, &(req.tv_sec),
+                       DBUS_TYPE_INT64, &(req.tv_nsec), DBUS_TYPE_INVALID);
+               reply = dbus_connection_send_with_reply_and_block(connection, msg,
+                               DBUS_TIMEOUT_USE_DEFAULT, &error);
+               if(reply == NULL){
+                       if(dbus_error_is_set(&error)){
+                               DBG("%s", error.message);
+                               dbus_error_free(&error);
+                       }
+                       else{
+                               DBG("Failed to request set time");
+                       }
+                       dbus_connection_unref(connection);
+                       dbus_message_unref(msg);
+                       return;
+               }
+
+               dbus_message_unref(msg);
+               dbus_message_unref(reply);
+               dbus_connection_unref(connection);
+
+               DBG("%lu cur seconds, %lu cur nsecs, %lu req seconds, %lu req nsecs",
+                       cur.tv_sec, cur.tv_nsec, req.tv_sec, req.tv_nsec);
+               DBG("setting time");
+
+               __connman_clock_set_time_updated(true);
+       }
+#else
        if (offset < STEPTIME_MIN_OFFSET && offset > -STEPTIME_MIN_OFFSET) {
                tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
                tmx.status = STA_PLL;
@@ -389,6 +453,7 @@ static void decode_msg(struct ntp_data *nd, void *base, size_t len,
                LOGTOD(msg->poll), offset, delay, tmx.freq / 65536);
 
        nd->cb(true, nd->user_data);
+#endif
 }
 
 static gboolean received_data(GIOChannel *channel, GIOCondition condition,