summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2015-02-25 18:25:26 +0100
committerLubomir Rintel <lkundrak@v3.sk>2015-02-25 18:25:26 +0100
commitd7f977eba88877735ea6420eeace64b2dd1d8439 (patch)
treed32fefe0e8771138aedb191c7289bc0f81a1b262
parent8b35b9e06118fd87bb32e79ad10952cf2b236a24 (diff)
parent73e8aeadba15ceca86a785dde909ccbb9d484356 (diff)
downloadNetworkManager-d7f977eba88877735ea6420eeace64b2dd1d8439.tar.gz
dns-manager,config: merge branch 'lr/dns-reconfig-rh1062301'
Refresh DNS plugin in SIGHUP. https://bugzilla.redhat.com/show_bug.cgi?id=1062301
-rw-r--r--src/dns-manager/nm-dns-manager.c46
-rw-r--r--src/nm-config-data.c17
-rw-r--r--src/nm-config-data.h4
-rw-r--r--src/nm-config.c13
-rw-r--r--src/nm-config.h1
5 files changed, 63 insertions, 18 deletions
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c
index 3c15c76e67..f9a4fd44ae 100644
--- a/src/dns-manager/nm-dns-manager.c
+++ b/src/dns-manager/nm-dns-manager.c
@@ -85,6 +85,8 @@ typedef struct {
NMDnsManagerResolvConfMode resolv_conf_mode;
NMDnsPlugin *plugin;
+ NMConfig *config;
+
gboolean dns_touched;
} NMDnsManagerPrivate;
@@ -1075,6 +1077,8 @@ init_resolv_conf_mode (NMDnsManager *self)
const char *mode;
int fd, flags;
+ g_clear_object (&priv->plugin);
+
fd = open (_PATH_RESCONF, O_RDONLY);
if (fd != -1) {
if (ioctl (fd, FS_IOC_GETFLAGS, &flags) == -1)
@@ -1088,7 +1092,7 @@ init_resolv_conf_mode (NMDnsManager *self)
}
}
- mode = nm_config_get_dns_mode (nm_config_get ());
+ mode = nm_config_data_get_dns_mode (nm_config_get_data (priv->config));
if (!g_strcmp0 (mode, "none")) {
priv->resolv_conf_mode = NM_DNS_MANAGER_RESOLV_CONF_UNMANAGED;
nm_log_info (LOGD_DNS, "DNS: not managing " _PATH_RESCONF);
@@ -1103,6 +1107,31 @@ init_resolv_conf_mode (NMDnsManager *self)
if (mode && g_strcmp0 (mode, "default") != 0)
nm_log_warn (LOGD_DNS, "Unknown DNS mode '%s'", mode);
}
+
+ if (priv->plugin) {
+ nm_log_info (LOGD_DNS, "DNS: loaded plugin %s", nm_dns_plugin_get_name (priv->plugin));
+ g_signal_connect (priv->plugin, NM_DNS_PLUGIN_FAILED, G_CALLBACK (plugin_failed), self);
+ }
+}
+
+static void
+config_changed_cb (NMConfig *config,
+ NMConfigData *config_data,
+ NMConfigChangeFlags changes,
+ NMConfigData *old_data,
+ NMDnsManager *self)
+{
+ GError *error = NULL;
+
+ if (!(changes & NM_CONFIG_CHANGE_DNS_MODE))
+ return;
+
+ init_resolv_conf_mode (self);
+ if (!update_dns (self, TRUE, &error)) {
+ nm_log_warn (LOGD_DNS, "could not commit DNS changes: (%d) %s",
+ error->code, error->message);
+ g_clear_error (&error);
+ }
}
static void
@@ -1113,12 +1142,12 @@ nm_dns_manager_init (NMDnsManager *self)
/* Set the initial hash */
compute_hash (self, NM_DNS_MANAGER_GET_PRIVATE (self)->hash);
+ priv->config = g_object_ref (nm_config_get ());
+ g_signal_connect (G_OBJECT (priv->config),
+ NM_CONFIG_SIGNAL_CONFIG_CHANGED,
+ G_CALLBACK (config_changed_cb),
+ self);
init_resolv_conf_mode (self);
-
- if (priv->plugin) {
- nm_log_info (LOGD_DNS, "DNS: loaded plugin %s", nm_dns_plugin_get_name (priv->plugin));
- g_signal_connect (priv->plugin, NM_DNS_PLUGIN_FAILED, G_CALLBACK (plugin_failed), self);
- }
}
static void
@@ -1143,6 +1172,11 @@ dispose (GObject *object)
priv->dns_touched = FALSE;
}
+ if (priv->config) {
+ g_signal_handlers_disconnect_by_func (priv->config, config_changed_cb, self);
+ g_clear_object (&priv->config);
+ }
+
g_slist_free_full (priv->configs, g_object_unref);
priv->configs = NULL;
diff --git a/src/nm-config-data.c b/src/nm-config-data.c
index 270c302f12..45d90b51d2 100644
--- a/src/nm-config-data.c
+++ b/src/nm-config-data.c
@@ -42,6 +42,8 @@ typedef struct {
char **arr;
GSList *specs;
} no_auto_default;
+
+ char *dns_mode;
} NMConfigDataPrivate;
@@ -128,6 +130,14 @@ nm_config_data_get_no_auto_default_list (const NMConfigData *self)
return NM_CONFIG_DATA_GET_PRIVATE (self)->no_auto_default.specs;
}
+const char *
+nm_config_data_get_dns_mode (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->dns_mode;
+}
+
/************************************************************************/
static gboolean
@@ -192,6 +202,9 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
if (spec_old || spec_new)
changes |= NM_CONFIG_CHANGE_NO_AUTO_DEFAULT;
+ if (g_strcmp0 (nm_config_data_get_dns_mode (old_data), nm_config_data_get_dns_mode (new_data)))
+ changes |= NM_CONFIG_CHANGE_DNS_MODE;
+
return changes;
}
@@ -286,6 +299,8 @@ finalize (GObject *gobject)
g_slist_free (priv->no_auto_default.specs);
g_strfreev (priv->no_auto_default.arr);
+ g_free (priv->dns_mode);
+
g_key_file_unref (priv->keyfile);
G_OBJECT_CLASS (nm_config_data_parent_class)->finalize (gobject);
@@ -309,6 +324,8 @@ constructed (GObject *object)
interval = g_key_file_get_integer (priv->keyfile, "connectivity", "interval", NULL);
priv->connectivity.interval = MAX (0, interval);
+ priv->dns_mode = g_key_file_get_value (priv->keyfile, "main", "dns", NULL);
+
G_OBJECT_CLASS (nm_config_data_parent_class)->constructed (object);
}
diff --git a/src/nm-config-data.h b/src/nm-config-data.h
index bb88bf7ea2..f260a73a90 100644
--- a/src/nm-config-data.h
+++ b/src/nm-config-data.h
@@ -43,6 +43,7 @@ G_BEGIN_DECLS
#define NM_CONFIG_DATA_CONNECTIVITY_INTERVAL "connectivity-interval"
#define NM_CONFIG_DATA_CONNECTIVITY_RESPONSE "connectivity-response"
#define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default"
+#define NM_CONFIG_DATA_DNS_MODE "dns"
typedef enum { /*< flags >*/
NM_CONFIG_CHANGE_NONE = 0,
@@ -50,6 +51,7 @@ typedef enum { /*< flags >*/
NM_CONFIG_CHANGE_VALUES = (1L << 1),
NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 2),
NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 3),
+ NM_CONFIG_CHANGE_DNS_MODE = (1L << 4),
_NM_CONFIG_CHANGE_LAST,
NM_CONFIG_CHANGE_ALL = ((_NM_CONFIG_CHANGE_LAST - 1) << 1) - 1,
@@ -85,6 +87,8 @@ const char *nm_config_data_get_connectivity_response (const NMConfigData *config
const char *const*nm_config_data_get_no_auto_default (const NMConfigData *config_data);
const GSList * nm_config_data_get_no_auto_default_list (const NMConfigData *config_data);
+const char *nm_config_data_get_dns_mode (const NMConfigData *self);
+
G_END_DECLS
#endif /* NM_CONFIG_DATA_H */
diff --git a/src/nm-config.c b/src/nm-config.c
index 594d05f2e3..eabb378664 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -70,7 +70,6 @@ typedef struct {
gboolean monitor_connection_files;
gboolean auth_polkit;
char *dhcp_client;
- char *dns_mode;
char *log_level;
char *log_domains;
@@ -198,14 +197,6 @@ nm_config_get_dhcp_client (NMConfig *config)
}
const char *
-nm_config_get_dns_mode (NMConfig *config)
-{
- g_return_val_if_fail (config != NULL, NULL);
-
- return NM_CONFIG_GET_PRIVATE (config)->dns_mode;
-}
-
-const char *
nm_config_get_log_level (NMConfig *config)
{
g_return_val_if_fail (config != NULL, NULL);
@@ -738,6 +729,8 @@ _change_flags_one_to_string (NMConfigChangeFlags flag)
return "connectivity";
case NM_CONFIG_CHANGE_NO_AUTO_DEFAULT:
return "no-auto-default";
+ case NM_CONFIG_CHANGE_DNS_MODE:
+ return "dns-mode";
default:
g_return_val_if_reached ("unknown");
}
@@ -852,7 +845,6 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error)
priv->auth_polkit = _get_bool_value (keyfile, "main", "auth-polkit", NM_CONFIG_DEFAULT_AUTH_POLKIT);
priv->dhcp_client = g_key_file_get_value (keyfile, "main", "dhcp", NULL);
- priv->dns_mode = g_key_file_get_value (keyfile, "main", "dns", NULL);
priv->log_level = g_key_file_get_value (keyfile, "logging", "level", NULL);
priv->log_domains = g_key_file_get_value (keyfile, "logging", "domains", NULL);
@@ -911,7 +903,6 @@ finalize (GObject *gobject)
g_free (priv->no_auto_default_file);
g_strfreev (priv->plugins);
g_free (priv->dhcp_client);
- g_free (priv->dns_mode);
g_free (priv->log_level);
g_free (priv->log_domains);
g_free (priv->debug);
diff --git a/src/nm-config.h b/src/nm-config.h
index 46388b08eb..b82dfb3e9f 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -68,7 +68,6 @@ const char **nm_config_get_plugins (NMConfig *config);
gboolean nm_config_get_monitor_connection_files (NMConfig *config);
gboolean nm_config_get_auth_polkit (NMConfig *config);
const char *nm_config_get_dhcp_client (NMConfig *config);
-const char *nm_config_get_dns_mode (NMConfig *config);
const char *nm_config_get_log_level (NMConfig *config);
const char *nm_config_get_log_domains (NMConfig *config);
const char *nm_config_get_debug (NMConfig *config);