Add support for using public DNS servers
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Dec 2009 03:13:14 +0000 (04:13 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Dec 2009 03:13:14 +0000 (04:13 +0100)
include/resolver.h
src/resolver.c

index 18c3ab8..1ca2b1d 100644 (file)
@@ -32,6 +32,15 @@ extern "C" {
  * @short_description: Functions for registering resolver modules
  */
 
+int connman_resolver_append(const char *interface, const char *domain,
+                                                       const char *server);
+int connman_resolver_remove(const char *interface, const char *domain,
+                                                       const char *server);
+int connman_resolver_remove_all(const char *interface);
+
+int connman_resolver_append_public_server(const char *server);
+int connman_resolver_remove_public_server(const char *server);
+
 #define CONNMAN_RESOLVER_PRIORITY_LOW      -100
 #define CONNMAN_RESOLVER_PRIORITY_DEFAULT     0
 #define CONNMAN_RESOLVER_PRIORITY_HIGH      100
@@ -48,10 +57,6 @@ struct connman_resolver {
 int connman_resolver_register(struct connman_resolver *resolver);
 void connman_resolver_unregister(struct connman_resolver *resolver);
 
-int connman_resolver_append(const char *interface, const char *domain,
-                                                       const char *server);
-int connman_resolver_remove_all(const char *interface);
-
 #ifdef __cplusplus
 }
 #endif
index 3cf3732..dec1357 100644 (file)
@@ -178,6 +178,48 @@ int connman_resolver_append(const char *interface, const char *domain,
 }
 
 /**
+ * connman_resolver_remove:
+ * @interface: network interface
+ * @domain: domain limitation
+ * @server: server address
+ *
+ * Remover resolver server address from current list
+ */
+int connman_resolver_remove(const char *interface, const char *domain,
+                                                       const char *server)
+{
+       GSList *list, *matches = NULL;
+
+       DBG("interface %s domain %s server %s", interface, domain, server);
+
+       if (server == NULL)
+               return -EINVAL;
+
+       for (list = entry_list; list; list = list->next) {
+               struct entry_data *entry = list->data;
+
+               if (interface != NULL &&
+                               g_strcmp0(entry->interface, interface) != 0)
+                       continue;
+
+               if (domain != NULL && g_strcmp0(entry->domain, domain) != 0)
+                       continue;
+
+               if (g_strcmp0(entry->server, server) != 0)
+                       continue;
+
+               matches = g_slist_append(matches, entry);
+       }
+
+       if (matches == NULL)
+               return -ENOENT;
+
+       remove_entries(matches);
+
+       return 0;
+}
+
+/**
  * connman_resolver_remove_all:
  * @interface: network interface
  *
@@ -189,20 +231,52 @@ int connman_resolver_remove_all(const char *interface)
 
        DBG("interface %s", interface);
 
+       if (interface == NULL)
+               return -EINVAL;
+
        for (list = entry_list; list; list = list->next) {
                struct entry_data *entry = list->data;
 
-               if (g_str_equal(entry->interface, interface) == FALSE)
+               if (g_strcmp0(entry->interface, interface) != 0)
                        continue;
 
                matches = g_slist_append(matches, entry);
        }
 
+       if (matches == NULL)
+               return -ENOENT;
+
        remove_entries(matches);
 
        return 0;
 }
 
+/**
+ * connman_resolver_append_public_server:
+ * @server: server address
+ *
+ * Append public resolver server address to current list
+ */
+int connman_resolver_append_public_server(const char *server)
+{
+       DBG("server %s", server);
+
+       return connman_resolver_append(NULL, NULL, server);
+}
+
+/**
+ * connman_resolver_remove_public_server:
+ * @server: server address
+ *
+ * Remove public resolver server address to current list
+ */
+int connman_resolver_remove_public_server(const char *server)
+{
+       DBG("server %s", server);
+
+       return connman_resolver_remove(NULL, NULL, server);
+}
+
 static int selftest_append(const char *interface, const char *domain,
                                                        const char *server)
 {
@@ -235,6 +309,10 @@ int __connman_resolver_selftest(void)
        connman_resolver_append("eth0", "moblin.org", "192.168.42.1");
        connman_resolver_append("wlan0", "lwn.net", "192.168.0.2");
 
+       connman_resolver_append_public_server("8.8.8.8");
+
+       connman_resolver_remove_public_server("8.8.8.8");
+
        connman_resolver_remove_all("wlan0");
 
        connman_resolver_unregister(&selftest_resolver);