summaryrefslogtreecommitdiff
path: root/src/nm-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-config.c')
-rw-r--r--src/nm-config.c71
1 files changed, 56 insertions, 15 deletions
diff --git a/src/nm-config.c b/src/nm-config.c
index c7e61b559e..fdb0450ec0 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -103,7 +103,7 @@ G_DEFINE_TYPE_WITH_CODE (NMConfig, nm_config, G_TYPE_OBJECT,
/************************************************************************/
-static void _set_config_data (NMConfig *self, NMConfigData *new_data);
+static void _set_config_data (NMConfig *self, NMConfigData *new_data, int signal);
/************************************************************************/
@@ -315,7 +315,7 @@ nm_config_set_no_auto_default_for_device (NMConfig *self, NMDevice *device)
new_data = nm_config_data_new_update_no_auto_default (priv->config_data, (const char *const*) no_auto_default);
g_strfreev (no_auto_default);
- _set_config_data (self, new_data);
+ _set_config_data (self, new_data, 0);
}
/************************************************************************/
@@ -670,7 +670,7 @@ nm_config_get_device_match_spec (const GKeyFile *keyfile, const char *group, con
/************************************************************************/
void
-nm_config_reload (NMConfig *self)
+nm_config_reload (NMConfig *self, int signal)
{
NMConfigPrivate *priv;
GError *error = NULL;
@@ -683,6 +683,11 @@ nm_config_reload (NMConfig *self)
priv = NM_CONFIG_GET_PRIVATE (self);
+ if (signal != SIGHUP) {
+ _set_config_data (self, NULL, signal);
+ return;
+ }
+
/* pass on the original command line options. This means, that
* options specified at command line cannot ever be reloaded from
* file. That seems desirable.
@@ -695,6 +700,7 @@ nm_config_reload (NMConfig *self)
if (!keyfile) {
nm_log_err (LOGD_CORE, "Failed to reload the configuration: %s", error->message);
g_clear_error (&error);
+ _set_config_data (self, NULL, signal);
return;
}
new_data = nm_config_data_new (config_main_file, config_description, nm_config_data_get_no_auto_default (priv->config_data), keyfile);
@@ -702,13 +708,19 @@ nm_config_reload (NMConfig *self)
g_free (config_description);
g_key_file_unref (keyfile);
- _set_config_data (self, new_data);
+ _set_config_data (self, new_data, signal);
}
static const char *
_change_flags_one_to_string (NMConfigChangeFlags flag)
{
switch (flag) {
+ case NM_CONFIG_CHANGE_SIGHUP:
+ return "SIGHUP";
+ case NM_CONFIG_CHANGE_SIGUSR1:
+ return "SIGUSR1";
+ case NM_CONFIG_CHANGE_SIGUSR2:
+ return "SIGUSR2";
case NM_CONFIG_CHANGE_CONFIG_FILES:
return "config-files";
case NM_CONFIG_CHANGE_VALUES:
@@ -743,24 +755,53 @@ nm_config_change_flags_to_string (NMConfigChangeFlags flags)
}
static void
-_set_config_data (NMConfig *self, NMConfigData *new_data)
+_set_config_data (NMConfig *self, NMConfigData *new_data, int signal)
{
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
NMConfigData *old_data = priv->config_data;
- NMConfigChangeFlags changes;
+ NMConfigChangeFlags changes, changes_diff;
gs_free char *log_str = NULL;
+ gboolean had_new_data = !!new_data;
- changes = nm_config_data_diff (old_data, new_data);
- if (changes == NM_CONFIG_CHANGE_NONE) {
- g_object_unref (new_data);
- return;
+ switch (signal) {
+ case SIGHUP:
+ changes = NM_CONFIG_CHANGE_SIGHUP;
+ break;
+ case SIGUSR1:
+ changes = NM_CONFIG_CHANGE_SIGUSR1;
+ break;
+ case SIGUSR2:
+ changes = NM_CONFIG_CHANGE_SIGUSR2;
+ break;
+ default:
+ changes = NM_CONFIG_CHANGE_NONE;
+ break;
+ }
+
+ if (new_data) {
+ changes_diff = nm_config_data_diff (old_data, new_data);
+ if (changes_diff == NM_CONFIG_CHANGE_NONE)
+ g_clear_object (&new_data);
+ else
+ changes |= changes_diff;
}
- nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data),
- (log_str = nm_config_change_flags_to_string (changes)));
- priv->config_data = new_data;
- g_signal_emit (self, signals[SIGNAL_CONFIG_CHANGED], 0, new_data, changes, old_data);
- g_object_unref (old_data);
+ if (changes == NM_CONFIG_CHANGE_NONE)
+ return;
+
+ if (new_data) {
+ nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data),
+ (log_str = nm_config_change_flags_to_string (changes)));
+ priv->config_data = new_data;
+ } else if (had_new_data)
+ nm_log_info (LOGD_CORE, "config: signal %s (no changes from disk)", (log_str = nm_config_change_flags_to_string (changes)));
+ else
+ nm_log_info (LOGD_CORE, "config: signal %s", (log_str = nm_config_change_flags_to_string (changes)));
+ g_signal_emit (self, signals[SIGNAL_CONFIG_CHANGED], 0,
+ new_data ? new_data : old_data,
+ changes, old_data);
+ if (new_data)
+ g_object_unref (old_data);
}
NM_DEFINE_SINGLETON_DESTRUCTOR (NMConfig);