diff --git a/CHANGELOG b/CHANGELOG index ffb60e6..fec5d6d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -68,6 +68,9 @@ version 2.67 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 @@ by '/', like the --server syntax, eg. 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 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings) 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 @@ DBusHandlerResult message_handler(DBusConnection *connection, { 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 @@ DBusHandlerResult message_handler(DBusConnection *connection, } 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 */