Make --clear-on-reload apply to DBus API too.
diff --git a/CHANGELOG b/CHANGELOG
index ffb60e6..fec5d6d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -68,6 +68,9 @@
name to request that a FQDN option is returned in the
reply. Thanks to Roy Marples for the patch.
+ Make --clear-on-reload apply to setting upstream servers
+ via DBus too.
+
version 2.66
Add the ability to act as an authoritative DNS
diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
index a519fdb..8e9137c 100644
--- a/man/dnsmasq.8
+++ b/man/dnsmasq.8
@@ -338,7 +338,8 @@
Don't poll /etc/resolv.conf for changes.
.TP
.B --clear-on-reload
-Whenever /etc/resolv.conf is re-read, clear the DNS cache.
+Whenever /etc/resolv.conf is re-read or the upstream servers are set
+via DBus, clear the DNS cache.
This is useful when new nameservers may have different
data than that held in cache.
.TP
diff --git a/src/dbus.c b/src/dbus.c
index 7379341..da28a28 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -305,8 +305,6 @@
const char *addr_err;
char *dup = NULL;
- my_syslog(LOG_INFO, _("setting upstream servers from DBus"));
-
if (!dbus_message_iter_init(message, &iter))
{
return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
@@ -478,6 +476,7 @@
{
char *method = (char *)dbus_message_get_member(message);
DBusMessage *reply = NULL;
+ int clear_cache = 0, new_servers = 0;
if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
{
@@ -501,24 +500,34 @@
}
else if (strcmp(method, "SetServers") == 0)
{
- my_syslog(LOG_INFO, _("setting upstream servers from DBus"));
dbus_read_servers(message);
- check_servers();
+ new_servers = 1;
}
else if (strcmp(method, "SetServersEx") == 0)
{
reply = dbus_read_servers_ex(message, 0);
- check_servers();
+ new_servers = 1;
}
else if (strcmp(method, "SetDomainServers") == 0)
{
reply = dbus_read_servers_ex(message, 1);
- check_servers();
+ new_servers = 1;
}
else if (strcmp(method, "ClearCache") == 0)
- clear_cache_and_reload(dnsmasq_time());
+ clear_cache = 1;
else
return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
+
+ if (new_servers)
+ {
+ my_syslog(LOG_INFO, _("setting upstream servers from DBus"));
+ check_servers();
+ if (option_bool(OPT_RELOAD))
+ clear_cache = 1;
+ }
+
+ if (clear_cache)
+ clear_cache_and_reload(dnsmasq_time());
method = user_data; /* no warning */