diff options
author | Thomas Haller <thaller@redhat.com> | 2015-01-07 17:09:52 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-02-03 13:01:53 +0100 |
commit | 13c7f6a56db55db47d31a181c85913f1d183f95a (patch) | |
tree | 530f8e3607046fed3637c179a657eb655b0166a8 | |
parent | 49b3f5b8d9e3b01cfd23bf72f9df2a6e76006bbe (diff) | |
download | NetworkManager-13c7f6a56db55db47d31a181c85913f1d183f95a.tar.gz |
config: move no-auto-default to NMConfigData
With this change, NMConfig is really immutable and all
modifyable parts migrated to NMConfigData.
Another advantage is that components can now subscribe to
NMConfig changes to pickup changes to no-auto-default.
-rw-r--r-- | src/devices/nm-device-ethernet.c | 2 | ||||
-rw-r--r-- | src/nm-config-data.c | 70 | ||||
-rw-r--r-- | src/nm-config-data.h | 6 | ||||
-rw-r--r-- | src/nm-config.c | 73 | ||||
-rw-r--r-- | src/nm-config.h | 7 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 2 | ||||
-rw-r--r-- | src/tests/config/test-config.c | 34 |
7 files changed, 143 insertions, 51 deletions
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c index 0027958c38..af24f8be6d 100644 --- a/src/devices/nm-device-ethernet.c +++ b/src/devices/nm-device-ethernet.c @@ -1463,7 +1463,7 @@ new_default_connection (NMDevice *self) const char *hw_address; char *defname, *uuid; - if (!nm_config_get_ethernet_can_auto_default (nm_config_get (), self)) + if (nm_config_get_no_auto_default_for_device (nm_config_get (), self)) return NULL; hw_address = nm_device_get_hw_address (self); diff --git a/src/nm-config-data.c b/src/nm-config-data.c index 93a56df1e3..cf140739fc 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -37,6 +37,11 @@ typedef struct { char *response; guint interval; } connectivity; + + struct { + char **arr; + GSList *specs; + } no_auto_default; } NMConfigDataPrivate; @@ -48,6 +53,7 @@ enum { PROP_CONNECTIVITY_URI, PROP_CONNECTIVITY_INTERVAL, PROP_CONNECTIVITY_RESPONSE, + PROP_NO_AUTO_DEFAULT, LAST_PROP }; @@ -106,6 +112,21 @@ nm_config_data_get_connectivity_response (const NMConfigData *self) return NM_CONFIG_DATA_GET_PRIVATE (self)->connectivity.response; } +const char *const* +nm_config_data_get_no_auto_default (const NMConfigData *self) +{ + g_return_val_if_fail (self, FALSE); + + return (const char *const*) NM_CONFIG_DATA_GET_PRIVATE (self)->no_auto_default.arr; +} + +const GSList * +nm_config_data_get_no_auto_default_list (const NMConfigData *self) +{ + g_return_val_if_fail (self, NULL); + + return NM_CONFIG_DATA_GET_PRIVATE (self)->no_auto_default.specs; +} /************************************************************************/ @@ -141,6 +162,7 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data) { GHashTable *changes; 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); @@ -163,6 +185,15 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *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); + spec_old = priv_old->no_auto_default.specs; + spec_new = priv_new->no_auto_default.specs; + while (spec_old && spec_new && strcmp (spec_old->data, spec_new->data) == 0) { + spec_old = spec_old->next; + spec_new = spec_new->next; + } + if (spec_old || spec_new) + g_hash_table_insert (changes, NM_CONFIG_CHANGES_NO_AUTO_DEFAULT, NULL); + if (!g_hash_table_size (changes)) { g_hash_table_destroy (changes); return NULL; @@ -187,6 +218,9 @@ get_property (GObject *object, case PROP_CONFIG_DESCRIPTION: g_value_set_string (value, nm_config_data_get_config_description (self)); break; + case PROP_NO_AUTO_DEFAULT: + g_value_take_boxed (value, g_strdupv ((char **) nm_config_data_get_no_auto_default (self))); + break; case PROP_CONNECTIVITY_URI: g_value_set_string (value, nm_config_data_get_connectivity_uri (self)); break; @@ -210,6 +244,7 @@ set_property (GObject *object, { NMConfigData *self = NM_CONFIG_DATA (object); NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (self); + guint i; /* This type is immutable. All properties are construct only. */ switch (prop_id) { @@ -224,6 +259,14 @@ set_property (GObject *object, if (!priv->keyfile) priv->keyfile = nm_config_create_keyfile (); break; + case PROP_NO_AUTO_DEFAULT: + priv->no_auto_default.arr = g_strdupv (g_value_get_boxed (value)); + if (!priv->no_auto_default.arr) + priv->no_auto_default.arr = g_new0 (char *, 1); + for (i = 0; priv->no_auto_default.arr[i]; i++) + priv->no_auto_default.specs = g_slist_prepend (priv->no_auto_default.specs, priv->no_auto_default.arr[i]); + priv->no_auto_default.specs = g_slist_reverse (priv->no_auto_default.specs); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -246,6 +289,9 @@ finalize (GObject *gobject) g_free (priv->connectivity.uri); g_free (priv->connectivity.response); + g_slist_free (priv->no_auto_default.specs); + g_strfreev (priv->no_auto_default.arr); + G_OBJECT_CLASS (nm_config_data_parent_class)->finalize (gobject); } @@ -273,12 +319,28 @@ constructed (GObject *object) NMConfigData * nm_config_data_new (const char *config_main_file, const char *config_description, + const char *const*no_auto_default, GKeyFile *keyfile) { return g_object_new (NM_TYPE_CONFIG_DATA, NM_CONFIG_DATA_CONFIG_MAIN_FILE, config_main_file, NM_CONFIG_DATA_CONFIG_DESCRIPTION, config_description, NM_CONFIG_DATA_KEYFILE, keyfile, + NM_CONFIG_DATA_NO_AUTO_DEFAULT, no_auto_default, + NULL); +} + +NMConfigData * +nm_config_data_new_update_no_auto_default (const NMConfigData *base, + const char *const*no_auto_default) +{ + NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (base); + + return g_object_new (NM_TYPE_CONFIG_DATA, + NM_CONFIG_DATA_CONFIG_MAIN_FILE, priv->config_main_file, + NM_CONFIG_DATA_CONFIG_DESCRIPTION, priv->config_description, + NM_CONFIG_DATA_KEYFILE, priv->keyfile, /* the keyfile is unchanged. It's safe to share it. */ + NM_CONFIG_DATA_NO_AUTO_DEFAULT, no_auto_default, NULL); } @@ -340,5 +402,13 @@ nm_config_data_class_init (NMConfigDataClass *config_class) G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property + (object_class, PROP_NO_AUTO_DEFAULT, + g_param_spec_boxed (NM_CONFIG_DATA_NO_AUTO_DEFAULT, "", "", + G_TYPE_STRV, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + } diff --git a/src/nm-config-data.h b/src/nm-config-data.h index d3425632b0..59b2806ccd 100644 --- a/src/nm-config-data.h +++ b/src/nm-config-data.h @@ -42,6 +42,7 @@ G_BEGIN_DECLS #define NM_CONFIG_DATA_CONNECTIVITY_URI "connectivity-uri" #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" struct _NMConfigData { GObject parent; @@ -55,7 +56,9 @@ GType nm_config_data_get_type (void); NMConfigData *nm_config_data_new (const char *config_main_file, const char *config_description, + const char *const*no_auto_default, 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); @@ -68,6 +71,9 @@ const char *nm_config_data_get_connectivity_uri (const NMConfigData *config_data const guint nm_config_data_get_connectivity_interval (const NMConfigData *config_data); const char *nm_config_data_get_connectivity_response (const NMConfigData *config_data); +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); + G_END_DECLS #endif /* NM_CONFIG_DATA_H */ diff --git a/src/nm-config.c b/src/nm-config.c index a295d1d520..42cda6605b 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -73,13 +73,9 @@ typedef struct { char *debug; - char **no_auto_default_orig; char **ignore_carrier; gboolean configure_and_quit; - - /* MUTABLE properties: */ - char **no_auto_default; /* mutable via merge_no_auto_default_state() */ } NMConfigPrivate; enum { @@ -102,6 +98,10 @@ G_DEFINE_TYPE (NMConfig, nm_config, G_TYPE_OBJECT) /************************************************************************/ +static void _set_config_data (NMConfig *self, NMConfigData *new_data); + +/************************************************************************/ + static gboolean _get_bool_value (GKeyFile *keyfile, const char *section, @@ -288,32 +288,31 @@ no_auto_default_merge_from_file (const char *no_auto_default_file, const char *c } gboolean -nm_config_get_ethernet_can_auto_default (NMConfig *config, NMDevice *device) +nm_config_get_no_auto_default_for_device (NMConfig *self, NMDevice *device) { - NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config); - GSList *specs = NULL; - int i; - gboolean match; - - for (i = 0; priv->no_auto_default[i]; i++) - specs = g_slist_prepend (specs, priv->no_auto_default[i]); + NMConfigData *config_data; - match = nm_device_spec_match_list (device, specs); + g_return_val_if_fail (NM_IS_CONFIG (self), FALSE); + g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); - g_slist_free (specs); - return !match; + config_data = NM_CONFIG_GET_PRIVATE (self)->config_data; + return nm_device_spec_match_list (device, nm_config_data_get_no_auto_default_list (config_data)); } void -nm_config_set_ethernet_no_auto_default (NMConfig *config, NMDevice *device) +nm_config_set_no_auto_default_for_device (NMConfig *self, NMDevice *device) { - NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config); + NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self); char *current; GString *updated; GError *error = NULL; char **no_auto_default; + NMConfigData *new_data = NULL; - if (!nm_config_get_ethernet_can_auto_default (config, device)) + g_return_if_fail (NM_IS_CONFIG (self)); + g_return_if_fail (NM_IS_DEVICE (device)); + + if (nm_config_get_no_auto_default_for_device (self, device)) return; updated = g_string_new (NULL); @@ -335,9 +334,11 @@ nm_config_set_ethernet_no_auto_default (NMConfig *config, NMDevice *device) g_string_free (updated, TRUE); - no_auto_default = no_auto_default_merge_from_file (priv->no_auto_default_file, (const char *const *) priv->no_auto_default); - g_strfreev (priv->no_auto_default); - priv->no_auto_default = no_auto_default; + no_auto_default = no_auto_default_merge_from_file (priv->no_auto_default_file, nm_config_data_get_no_auto_default (priv->config_data)); + 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); } /************************************************************************/ @@ -679,9 +680,7 @@ nm_config_reload (NMConfig *self) { NMConfigPrivate *priv; GError *error = NULL; - GHashTable *changes; GKeyFile *keyfile; - NMConfigData *old_data; NMConfigData *new_data = NULL; char *config_main_file = NULL; char *config_description = NULL; @@ -690,7 +689,6 @@ nm_config_reload (NMConfig *self) priv = NM_CONFIG_GET_PRIVATE (self); - /* pass on the original command line options. This means, that * options specified at command line cannot ever be reloaded from * file. That seems desirable. @@ -705,12 +703,21 @@ nm_config_reload (NMConfig *self) g_clear_error (&error); return; } - new_data = nm_config_data_new (config_main_file, config_description, keyfile); + new_data = nm_config_data_new (config_main_file, config_description, nm_config_data_get_no_auto_default (priv->config_data), keyfile); g_free (config_main_file); g_free (config_description); g_key_file_unref (keyfile); - old_data = priv->config_data; + _set_config_data (self, new_data); +} + +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; + changes = nm_config_data_diff (old_data, new_data); if (!changes) { @@ -769,6 +776,8 @@ nm_config_new (const NMConfigCmdLineOptions *cli, GError **error) GKeyFile *keyfile; char *config_main_file = NULL; char *config_description = NULL; + char **no_auto_default; + char **no_auto_default_orig; self = NM_CONFIG (g_object_new (NM_TYPE_CONFIG, NM_CONFIG_CMD_LINE_OPTIONS, cli, @@ -796,7 +805,6 @@ nm_config_new (const NMConfigCmdLineOptions *cli, GError **error) priv->no_auto_default_file = g_strdup (priv->cli.no_auto_default_file); else priv->no_auto_default_file = g_strdup (NM_NO_AUTO_DEFAULT_STATE_FILE); - priv->no_auto_default_orig = g_key_file_get_string_list (keyfile, "main", "no-auto-default", NULL, NULL); priv->plugins = g_key_file_get_string_list (keyfile, "main", "plugins", NULL, NULL); if (!priv->plugins) @@ -818,13 +826,18 @@ nm_config_new (const NMConfigCmdLineOptions *cli, GError **error) priv->configure_and_quit = _get_bool_value (keyfile, "main", "configure-and-quit", FALSE); - priv->config_data_orig = nm_config_data_new (config_main_file, config_description, keyfile); + no_auto_default_orig = g_key_file_get_string_list (keyfile, "main", "no-auto-default", NULL, NULL); + no_auto_default = no_auto_default_merge_from_file (priv->no_auto_default_file, (const char *const *) no_auto_default_orig); + + priv->config_data_orig = nm_config_data_new (config_main_file, config_description, (const char *const*) no_auto_default, keyfile); + + g_strfreev (no_auto_default); + g_strfreev (no_auto_default_orig); /* Initialize mutable members. */ priv->config_data = g_object_ref (priv->config_data_orig); - priv->no_auto_default = no_auto_default_merge_from_file (priv->no_auto_default_file, (const char *const *) priv->no_auto_default_orig); g_free (config_main_file); g_free (config_description); @@ -853,8 +866,6 @@ finalize (GObject *gobject) g_free (priv->log_level); g_free (priv->log_domains); g_free (priv->debug); - g_strfreev (priv->no_auto_default_orig); - g_strfreev (priv->no_auto_default); g_strfreev (priv->ignore_carrier); _nm_config_cmd_line_options_clear (&priv->cli); diff --git a/src/nm-config.h b/src/nm-config.h index 98a9d2af6d..b52a6b58f8 100644 --- a/src/nm-config.h +++ b/src/nm-config.h @@ -46,6 +46,7 @@ G_BEGIN_DECLS #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; @@ -76,9 +77,6 @@ const char *nm_config_get_log_domains (NMConfig *config); const char *nm_config_get_debug (NMConfig *config); gboolean nm_config_get_configure_and_quit (NMConfig *config); -gboolean nm_config_get_ethernet_can_auto_default (NMConfig *config, NMDevice *device); -void nm_config_set_ethernet_no_auto_default (NMConfig *config, NMDevice *device); - gboolean nm_config_get_ignore_carrier (NMConfig *config, NMDevice *device); /* for main.c only */ @@ -87,6 +85,9 @@ void nm_config_cmd_line_options_free (NMConfigCmdLineOptions void nm_config_cmd_line_options_add_to_entries (NMConfigCmdLineOptions *cli, GOptionContext *opt_ctx); +gboolean nm_config_get_no_auto_default_for_device (NMConfig *config, NMDevice *device); +void nm_config_set_no_auto_default_for_device (NMConfig *config, NMDevice *device); + NMConfig *nm_config_new (const NMConfigCmdLineOptions *cli, GError **error); NMConfig *nm_config_setup (const NMConfigCmdLineOptions *cli, GError **error); void nm_config_reload (NMConfig *config); diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 36611938ef..3f7d6abf02 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -1669,7 +1669,7 @@ default_wired_clear_tag (NMSettings *self, g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (default_wired_connection_updated_by_user_cb), self); if (add_to_no_auto_default) - nm_config_set_ethernet_no_auto_default (NM_SETTINGS_GET_PRIVATE (self)->config, device); + nm_config_set_no_auto_default_for_device (NM_SETTINGS_GET_PRIVATE (self)->config, device); } void diff --git a/src/tests/config/test-config.c b/src/tests/config/test-config.c index 8c52031c25..e5ac0dde4a 100644 --- a/src/tests/config/test-config.c +++ b/src/tests/config/test-config.c @@ -27,6 +27,9 @@ #include <nm-config.h> #include "nm-test-device.h" #include "nm-fake-platform.h" +#include "nm-logging.h" + +#include "nm-test-utils.h" static NMConfig * setup_config (GError **error, const char *config_file, const char *config_dir, ...) @@ -194,13 +197,16 @@ test_config_no_auto_default (void) dev3 = nm_test_device_new ("33:33:33:33:33:33"); dev4 = nm_test_device_new ("44:44:44:44:44:44"); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev1)); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev2)); - g_assert (nm_config_get_ethernet_can_auto_default (config, dev3)); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev4)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev1)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev2)); + g_assert (!nm_config_get_no_auto_default_for_device (config, dev3)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev4)); + + g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*config: update * (no-auto-default)*"); + nm_config_set_no_auto_default_for_device (config, dev3); + g_test_assert_expected_messages (); - nm_config_set_ethernet_no_auto_default (config, dev3); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev3)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev3)); g_object_unref (config); @@ -208,10 +214,10 @@ test_config_no_auto_default (void) "--no-auto-default", state_file, NULL); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev1)); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev2)); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev3)); - g_assert (!nm_config_get_ethernet_can_auto_default (config, dev4)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev1)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev2)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev3)); + g_assert (nm_config_get_no_auto_default_for_device (config, dev4)); g_object_unref (config); @@ -280,14 +286,12 @@ test_config_confdir_parse_error (void) g_clear_error (&error); } +NMTST_DEFINE (); + int main (int argc, char **argv) { -#if !GLIB_CHECK_VERSION (2, 35, 0) - g_type_init (); -#endif - - g_test_init (&argc, &argv, NULL); + nmtst_init_assert_logging (&argc, &argv); nm_fake_platform_setup (); |