#include "connman.h"
static GSList *driver_list = NULL;
+static GHashTable *server_hash = NULL;
static gint compare_priority(gconstpointer a, gconstpointer b)
{
*/
int connman_timeserver_append(const char *server)
{
+ GSList *list;
+
DBG("server %s", server);
if (server == NULL)
return -EINVAL;
- connman_info("Adding time server %s", server);
+ /* This server is already handled by a driver */
+ if (g_hash_table_lookup(server_hash, server))
+ return 0;
- return 0;
+ for (list = driver_list; list; list = list->next) {
+ struct connman_timeserver_driver *driver = list->data;
+ char *new_server;
+
+ if (driver->append == NULL)
+ continue;
+
+ new_server = g_strdup(server);
+ if (new_server == NULL)
+ return -ENOMEM;
+
+ if (driver->append(server) == 0) {
+ g_hash_table_insert(server_hash, new_server, driver);
+ return 0;
+ } else {
+ g_free(new_server);
+ }
+ }
+
+ return -ENOENT;
}
/**
*/
int connman_timeserver_remove(const char *server)
{
+ struct connman_timeserver_driver *driver;
+
DBG("server %s", server);
if (server == NULL)
return -EINVAL;
- connman_info("Removing time server %s", server);
+ driver = g_hash_table_lookup(server_hash, server);
+ if (driver == NULL)
+ return -EINVAL;
+
+ g_hash_table_remove(server_hash, server);
+
+ if (driver->remove == NULL)
+ return -ENOENT;
+
+ return driver->remove(server);
+}
+
+void connman_timeserver_sync(void)
+{
+ GSList *list;
+
+ DBG("");
+
+ for (list = driver_list; list; list = list->next) {
+ struct connman_timeserver_driver *driver = list->data;
+
+ if (driver->sync == NULL)
+ continue;
+
+ driver->sync();
+ }
+}
+
+int __connman_timeserver_init(void)
+{
+ DBG("");
+
+ server_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, NULL);
return 0;
}
+
+void __connman_timeserver_cleanup(void)
+{
+ DBG("");
+
+ g_hash_table_destroy(server_hash);
+}