mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-06 13:10:29 +01:00
config: use flags argument in config-changed signal instead of a hash table
(cherry picked from commit 5b47462f32)
This commit is contained in:
parent
0efcf3c680
commit
d9f372f439
5 changed files with 66 additions and 42 deletions
|
|
@ -157,33 +157,31 @@ _keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
GHashTable *
|
||||
NMConfigChangeFlags
|
||||
nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
|
||||
{
|
||||
GHashTable *changes;
|
||||
NMConfigChangeFlags changes = NM_CONFIG_CHANGE_NONE;
|
||||
NMConfigDataPrivate *priv_old, *priv_new;
|
||||
GSList *spec_old, *spec_new;
|
||||
|
||||
g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NULL);
|
||||
g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NULL);
|
||||
|
||||
changes = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NM_CONFIG_CHANGE_NONE);
|
||||
g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NM_CONFIG_CHANGE_NONE);
|
||||
|
||||
priv_old = NM_CONFIG_DATA_GET_PRIVATE (old_data);
|
||||
priv_new = NM_CONFIG_DATA_GET_PRIVATE (new_data);
|
||||
|
||||
if ( !_keyfile_a_contains_all_in_b (priv_old->keyfile, priv_new->keyfile)
|
||||
|| !_keyfile_a_contains_all_in_b (priv_new->keyfile, priv_old->keyfile))
|
||||
g_hash_table_insert (changes, NM_CONFIG_CHANGES_VALUES, NULL);
|
||||
changes |= NM_CONFIG_CHANGE_VALUES;
|
||||
|
||||
if ( g_strcmp0 (nm_config_data_get_config_main_file (old_data), nm_config_data_get_config_main_file (new_data)) != 0
|
||||
|| g_strcmp0 (nm_config_data_get_config_description (old_data), nm_config_data_get_config_description (new_data)) != 0)
|
||||
g_hash_table_insert (changes, NM_CONFIG_CHANGES_CONFIG_FILES, NULL);
|
||||
changes |= NM_CONFIG_CHANGE_CONFIG_FILES;
|
||||
|
||||
if ( nm_config_data_get_connectivity_interval (old_data) != nm_config_data_get_connectivity_interval (new_data)
|
||||
|| g_strcmp0 (nm_config_data_get_connectivity_uri (old_data), nm_config_data_get_connectivity_uri (new_data))
|
||||
|| g_strcmp0 (nm_config_data_get_connectivity_response (old_data), nm_config_data_get_connectivity_response (new_data)))
|
||||
g_hash_table_insert (changes, NM_CONFIG_CHANGES_CONNECTIVITY, NULL);
|
||||
changes |= NM_CONFIG_CHANGE_CONNECTIVITY;
|
||||
|
||||
spec_old = priv_old->no_auto_default.specs;
|
||||
spec_new = priv_new->no_auto_default.specs;
|
||||
|
|
@ -192,12 +190,8 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
|
|||
spec_new = spec_new->next;
|
||||
}
|
||||
if (spec_old || spec_new)
|
||||
g_hash_table_insert (changes, NM_CONFIG_CHANGES_NO_AUTO_DEFAULT, NULL);
|
||||
changes |= NM_CONFIG_CHANGE_NO_AUTO_DEFAULT;
|
||||
|
||||
if (!g_hash_table_size (changes)) {
|
||||
g_hash_table_destroy (changes);
|
||||
return NULL;
|
||||
}
|
||||
return changes;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,17 @@ G_BEGIN_DECLS
|
|||
#define NM_CONFIG_DATA_CONNECTIVITY_RESPONSE "connectivity-response"
|
||||
#define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default"
|
||||
|
||||
typedef enum { /*< flags >*/
|
||||
NM_CONFIG_CHANGE_NONE = 0,
|
||||
NM_CONFIG_CHANGE_CONFIG_FILES = (1L << 0),
|
||||
NM_CONFIG_CHANGE_VALUES = (1L << 1),
|
||||
NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 2),
|
||||
NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 3),
|
||||
|
||||
_NM_CONFIG_CHANGE_LAST,
|
||||
NM_CONFIG_CHANGE_ALL = ((_NM_CONFIG_CHANGE_LAST - 1) << 1) - 1,
|
||||
} NMConfigChangeFlags;
|
||||
|
||||
struct _NMConfigData {
|
||||
GObject parent;
|
||||
};
|
||||
|
|
@ -60,7 +71,7 @@ NMConfigData *nm_config_data_new (const char *config_main_file,
|
|||
GKeyFile *keyfile);
|
||||
NMConfigData *nm_config_data_new_update_no_auto_default (const NMConfigData *base, const char *const*no_auto_default);
|
||||
|
||||
GHashTable *nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
|
||||
NMConfigChangeFlags nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
|
||||
|
||||
const char *nm_config_data_get_config_main_file (const NMConfigData *config_data);
|
||||
const char *nm_config_data_get_config_description (const NMConfigData *config_data);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
#include "nm-glib-compat.h"
|
||||
#include "nm-device.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "gsystem-local-alloc.h"
|
||||
#include "nm-enum-types.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
|
@ -718,40 +720,60 @@ nm_config_reload (NMConfig *self)
|
|||
_set_config_data (self, new_data);
|
||||
}
|
||||
|
||||
static const char *
|
||||
_change_flags_one_to_string (NMConfigChangeFlags flag)
|
||||
{
|
||||
switch (flag) {
|
||||
case NM_CONFIG_CHANGE_CONFIG_FILES:
|
||||
return "config-files";
|
||||
case NM_CONFIG_CHANGE_VALUES:
|
||||
return "values";
|
||||
case NM_CONFIG_CHANGE_CONNECTIVITY:
|
||||
return "connectivity";
|
||||
case NM_CONFIG_CHANGE_NO_AUTO_DEFAULT:
|
||||
return "no-auto-default";
|
||||
default:
|
||||
g_return_val_if_reached ("unknown");
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
nm_config_change_flags_to_string (NMConfigChangeFlags flags)
|
||||
{
|
||||
GString *str = g_string_new ("");
|
||||
NMConfigChangeFlags s = 0x01;
|
||||
|
||||
while (flags) {
|
||||
if (NM_FLAGS_HAS (flags, s)) {
|
||||
if (str->len)
|
||||
g_string_append_c (str, ',');
|
||||
g_string_append (str, _change_flags_one_to_string (s));
|
||||
}
|
||||
flags = flags & ~s;
|
||||
s <<= 1;
|
||||
}
|
||||
return g_string_free (str, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
_set_config_data (NMConfig *self, NMConfigData *new_data)
|
||||
{
|
||||
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
|
||||
NMConfigData *old_data = priv->config_data;
|
||||
GHashTable *changes;
|
||||
NMConfigChangeFlags changes;
|
||||
gs_free char *log_str = NULL;
|
||||
|
||||
changes = nm_config_data_diff (old_data, new_data);
|
||||
|
||||
if (!changes) {
|
||||
if (changes == NM_CONFIG_CHANGE_NONE) {
|
||||
g_object_unref (new_data);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nm_logging_enabled (LOGL_INFO, LOGD_CORE)) {
|
||||
GString *str = g_string_new (NULL);
|
||||
GHashTableIter iter;
|
||||
const char *key;
|
||||
|
||||
g_hash_table_iter_init (&iter, changes);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) {
|
||||
if (str->len)
|
||||
g_string_append (str, ",");
|
||||
g_string_append (str, key);
|
||||
}
|
||||
nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data), str->str);
|
||||
g_string_free (str, TRUE);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
g_hash_table_destroy (changes);
|
||||
}
|
||||
|
||||
NM_DEFINE_SINGLETON_DESTRUCTOR (NMConfig);
|
||||
|
|
@ -936,7 +958,7 @@ nm_config_class_init (NMConfigClass *config_class)
|
|||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (NMConfigClass, config_changed),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, G_TYPE_HASH_TABLE, NM_TYPE_CONFIG_DATA);
|
||||
G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, NM_TYPE_CONFIG_CHANGE_FLAGS, NM_TYPE_CONFIG_DATA);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -43,11 +43,6 @@ G_BEGIN_DECLS
|
|||
/* Signals */
|
||||
#define NM_CONFIG_SIGNAL_CONFIG_CHANGED "config-changed"
|
||||
|
||||
#define NM_CONFIG_CHANGES_CONFIG_FILES "config-files"
|
||||
#define NM_CONFIG_CHANGES_VALUES "values"
|
||||
#define NM_CONFIG_CHANGES_CONNECTIVITY "connectivity"
|
||||
#define NM_CONFIG_CHANGES_NO_AUTO_DEFAULT "no-auto-default"
|
||||
|
||||
typedef struct NMConfigCmdLineOptions NMConfigCmdLineOptions;
|
||||
|
||||
struct _NMConfig {
|
||||
|
|
@ -65,6 +60,8 @@ GType nm_config_get_type (void);
|
|||
|
||||
NMConfig *nm_config_get (void);
|
||||
|
||||
char *nm_config_change_flags_to_string (NMConfigChangeFlags flags);
|
||||
|
||||
NMConfigData *nm_config_get_data (NMConfig *config);
|
||||
NMConfigData *nm_config_get_data_orig (NMConfig *config);
|
||||
const char **nm_config_get_plugins (NMConfig *config);
|
||||
|
|
|
|||
|
|
@ -466,7 +466,7 @@ active_connection_get_by_path (NMManager *manager, const char *path)
|
|||
/************************************************************************/
|
||||
|
||||
static void
|
||||
_config_changed_cb (NMConfig *config, NMConfigData *config_data, GHashTable *changes, NMConfigData *old_data, NMManager *self)
|
||||
_config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeFlags changes, NMConfigData *old_data, NMManager *self)
|
||||
{
|
||||
g_object_set (NM_MANAGER_GET_PRIVATE (self)->connectivity,
|
||||
NM_CONNECTIVITY_URI, nm_config_data_get_connectivity_uri (config_data),
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue