From 0051b44a09d67b50b548320233bb8d96d5c8018f Mon Sep 17 00:00:00 2001 From: Mathieu Trudel-Lapierre Date: Wed, 2 Nov 2011 15:05:43 -0500 Subject: [PATCH] dns: don't update routing and DNS if no devices were ever managed Avoids blowing away existing routes and resolv.conf if NM never managed any devices. --- src/dns-manager/nm-dns-manager.c | 21 +++++++++++++-------- src/nm-policy.c | 9 +++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index 0203f2bb8..ddfd47c84 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -1097,15 +1097,20 @@ dispose (GObject *object) g_slist_free (priv->plugins); priv->plugins = NULL; - /* If we're quitting leave a valid resolv.conf in place, not one - * pointing to 127.0.0.1 if any plugins were active. Thus update - * DNS after disposing of all plugins. + /* If last_iface is NULL, this means we haven't done a DNS update before, + * so no reason to try and take down entries from resolv.conf. */ - if (!update_dns (self, priv->last_iface, TRUE, &error)) { - nm_log_warn (LOGD_DNS, "could not commit DNS changes on shutdown: (%d) %s", - error ? error->code : -1, - error && error->message ? error->message : "(unknown)"); - g_clear_error (&error); + if (priv->last_iface != NULL) { + /* If we're quitting leave a valid resolv.conf in place, not one + * pointing to 127.0.0.1 if any plugins were active. Thus update + * DNS after disposing of all plugins. + */ + if (!update_dns (self, priv->last_iface, TRUE, &error)) { + nm_log_warn (LOGD_DNS, "could not commit DNS changes on shutdown: (%d) %s", + error ? error->code : -1, + error && error->message ? error->message : "(unknown)"); + g_clear_error (&error); + } } g_slist_foreach (priv->configs, (GFunc) g_object_unref, NULL); diff --git a/src/nm-policy.c b/src/nm-policy.c index 5c4059e10..a1e13f67f 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -1023,6 +1023,15 @@ device_state_changed (NMDevice *device, update_routing_and_dns (policy, FALSE); break; case NM_DEVICE_STATE_UNMANAGED: + if ( old_state == NM_DEVICE_STATE_UNAVAILABLE + || old_state == NM_DEVICE_STATE_DISCONNECTED) { + /* If the device was never activated, there's no point in + * updating routing or DNS. This allows us to keep the previous + * resolv.conf or routes from before NM started if no device was + * ever managed by NM. + */ + break; + } case NM_DEVICE_STATE_UNAVAILABLE: update_routing_and_dns (policy, FALSE); break;