diff options
Diffstat (limited to 'src/resolver.c')
-rw-r--r-- | src/resolver.c | 80 |
1 files changed, 79 insertions, 1 deletions
diff --git a/src/resolver.c b/src/resolver.c index 3cf37329..dec13573 100644 --- a/src/resolver.c +++ b/src/resolver.c @@ -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); |