iptables: Refactoring how jumps are handled
[framework/connectivity/connman.git] / src / timeserver.c
index 5d68246..038d44b 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2009  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2010  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
 #include <config.h>
 #endif
 
+#include <errno.h>
+
 #include <glib.h>
 
 #include "connman.h"
 
 static GSList *driver_list = NULL;
+static GHashTable *server_hash = NULL;
 
 static gint compare_priority(gconstpointer a, gconstpointer b)
 {
@@ -76,14 +79,37 @@ void connman_timeserver_driver_unregister(struct connman_timeserver_driver *driv
  */
 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;
 }
 
 /**
@@ -94,12 +120,54 @@ int connman_timeserver_append(const char *server)
  */
 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);
+}