diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2016-05-24 14:14:25 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-05-28 09:34:15 +0200 |
commit | 4feb58b50b9fd6caceda83bab907ad107ad8ed01 (patch) | |
tree | fb69ea4e0d461472180e06ead0127936ea4ae80a | |
parent | d376787ce1a9e8c4990ed98be143ab892c9d29ed (diff) | |
download | NetworkManager-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.c | 31 |
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 |