#define CONNMAN_API_SUBJECT_TO_CHANGE
#include <connman/plugin.h>
#include <connman/resolver.h>
+#include <connman/notifier.h>
#include <connman/log.h>
#include <glib.h>
char *server;
GIOChannel *channel;
guint watch;
+ gboolean enabled;
};
struct request_data {
data->domain = g_strdup(domain);
data->server = g_strdup(server);
+ /* Enable new servers by default */
+ data->enabled = TRUE;
+
return data;
}
.remove = dnsproxy_remove,
};
+static void dnsproxy_offline_mode(connman_bool_t enabled)
+{
+ GSList *list;
+
+ DBG("enabled %d", enabled);
+
+ for (list = server_list; list; list = list->next) {
+ struct server_data *data = list->data;
+
+ data->enabled = enabled ? FALSE : TRUE;
+ }
+}
+
+static struct connman_notifier dnsproxy_notifier = {
+ .name = "dnsproxy",
+ .offline_mode = dnsproxy_offline_mode,
+};
+
static int parse_request(unsigned char *buf, int len,
char *name, unsigned int size)
{
for (list = server_list; list; list = list->next) {
struct server_data *data = list->data;
- DBG("server %s domain %s", data->server, data->domain);
+ DBG("server %s domain %s enabled %d",
+ data->server, data->domain, data->enabled);
+
+ if (data->enabled == FALSE)
+ continue;
sk = g_io_channel_unix_get_fd(data->channel);
err = connman_resolver_register(&dnsproxy_resolver);
if (err < 0)
- destroy_listener();
+ goto destroy;
+
+ err = connman_notifier_register(&dnsproxy_notifier);
+ if (err < 0)
+ goto unregister;
+
+ return 0;
+
+unregister:
+ connman_resolver_unregister(&dnsproxy_resolver);
+
+destroy:
+ destroy_listener();
return err;
}
static void dnsproxy_exit(void)
{
- destroy_listener();
+ connman_notifier_unregister(&dnsproxy_notifier);
connman_resolver_unregister(&dnsproxy_resolver);
+
+ destroy_listener();
}
CONNMAN_PLUGIN_DEFINE(dnsproxy, "DNS proxy resolver plugin", VERSION,