summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-05-24 14:14:25 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2016-05-28 09:34:15 +0200
commit4feb58b50b9fd6caceda83bab907ad107ad8ed01 (patch)
treefb69ea4e0d461472180e06ead0127936ea4ae80a
parentd376787ce1a9e8c4990ed98be143ab892c9d29ed (diff)
downloadNetworkManager-4feb58b50b9fd6caceda83bab907ad107ad8ed01.tar.gz
dns: clear dnsmasq cache after an update
When the list of DNS servers changes, old DNS entries cached by dnsmasq must be invalidated as the answers returned by new servers may be different (especially, old NXDOMAIN entries may now be valid). Call the dnsmasq "ClearCache" D-Bus method to achieve this. https://bugzilla.redhat.com/show_bug.cgi?id=1338731
-rw-r--r--src/dns-manager/nm-dns-dnsmasq.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c
index 3d3c9755ea..8c7c8c3ecb 100644
--- a/src/dns-manager/nm-dns-dnsmasq.c
+++ b/src/dns-manager/nm-dns-dnsmasq.c
@@ -287,6 +287,25 @@ add_ip_config_data (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPC
}
static void
+dnsmasq_clear_cache_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
+{
+ NMDnsDnsmasq *self;
+ gs_free_error GError *error = NULL;
+ gs_unref_variant GVariant *response = NULL;
+
+ response = g_dbus_proxy_call_finish (proxy, res, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = NM_DNS_DNSMASQ (user_data);
+
+ if (!response)
+ _LOGW ("dnsmasq cache clear failed: %s", error->message);
+ else
+ _LOGD ("dnsmasq update successful, cache cleared");
+}
+
+static void
dnsmasq_update_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
{
NMDnsDnsmasq *self;
@@ -303,8 +322,16 @@ dnsmasq_update_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
if (!response)
_LOGW ("dnsmasq update failed: %s", error->message);
- else
- _LOGD ("dnsmasq update successful");
+ else {
+ g_dbus_proxy_call (priv->dnsmasq,
+ "ClearCache",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->update_cancellable,
+ (GAsyncReadyCallback) dnsmasq_clear_cache_done,
+ self);
+ }
}
static void