summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2014-08-12 18:30:44 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2014-08-12 18:30:44 +0100
commitaaeea9f6ed76da5502ccf6cc2e878e9cb8aeae97 (patch)
tree23e9d6528be8f941942c8b8a081a27f5c8afc685
parent40766e55e80f916a1c9ed5c642ddd3b1f758db06 (diff)
downloaddnsmasq-loop.tar.gz
GetLoopServers Dbus method.loop
-rw-r--r--dbus/DBus-interface9
-rw-r--r--src/dbus.c34
2 files changed, 43 insertions, 0 deletions
diff --git a/dbus/DBus-interface b/dbus/DBus-interface
index 8e7ed9d..9a895eb 100644
--- a/dbus/DBus-interface
+++ b/dbus/DBus-interface
@@ -160,6 +160,15 @@ for SetServersEx is represented as
"/eng.mycorp.com/lab.mycorp.com/1003:1234:abcd::1%eth0"
]
+GetLoopServers
+--------------
+
+(Only available if dnsmasq compiled with HAVE_LOOP)
+
+Return an array of strings, each string is the IP address of an upstream
+server which has been found to loop queries back to this dnsmasq instance, and
+it therefore not being used.
+
2. SIGNALS
diff --git a/src/dbus.c b/src/dbus.c
index 4696442..9b16bc2 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -35,6 +35,11 @@ const char* introspection_xml_template =
" <method name=\"GetVersion\">\n"
" <arg name=\"version\" direction=\"out\" type=\"s\"/>\n"
" </method>\n"
+#ifdef HAVE_LOOP
+" <method name=\"GetLoopServers\">\n"
+" <arg name=\"server\" direction=\"out\" type=\"as\"/>\n"
+" </method>\n"
+#endif
" <method name=\"SetServers\">\n"
" <arg name=\"servers\" direction=\"in\" type=\"av\"/>\n"
" </method>\n"
@@ -205,6 +210,29 @@ static void dbus_read_servers(DBusMessage *message)
cleanup_servers();
}
+#ifdef HAVE_LOOP
+static DBusMessage *dbus_reply_server_loop(DBusMessage *message)
+{
+ DBusMessageIter args, args_iter;
+ struct server *serv;
+ DBusMessage *reply = dbus_message_new_method_return(message);
+
+ dbus_message_iter_init_append (reply, &args);
+ dbus_message_iter_open_container (&args, DBUS_TYPE_ARRAY,DBUS_TYPE_STRING_AS_STRING, &args_iter);
+
+ for (serv = daemon->servers; serv; serv = serv->next)
+ if (serv->flags & SERV_LOOP)
+ {
+ prettyprint_addr(&serv->addr, daemon->addrbuff);
+ dbus_message_iter_append_basic (&args_iter, DBUS_TYPE_STRING, &daemon->addrbuff);
+ }
+
+ dbus_message_iter_close_container (&args, &args_iter);
+
+ return reply;
+}
+#endif
+
static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
{
DBusMessageIter iter, array_iter, string_iter;
@@ -433,6 +461,12 @@ DBusHandlerResult message_handler(DBusConnection *connection,
dbus_message_append_args(reply, DBUS_TYPE_STRING, &v, DBUS_TYPE_INVALID);
}
+#ifdef HAVE_LOOP
+ else if (strcmp(method, "GetLoopServers") == 0)
+ {
+ reply = dbus_reply_server_loop(message);
+ }
+#endif
else if (strcmp(method, "SetServers") == 0)
{
dbus_read_servers(message);