diff options
| author | Michael Biebl <biebl@debian.org> | 2017-01-17 20:25:09 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2017-01-17 20:25:09 +0100 |
| commit | 58f8be580039b0575b197b9573a1c92745d96d30 (patch) | |
| tree | 2c226233f623a0dcb529be0eb8cdf97e4a2ae0c0 /src/nm-config-data.c | |
| parent | 45cb5bb3c0e6edb887cf69b417fcaf7053814a9b (diff) | |
New upstream version 1.5.90 upstream/1.5.90
Diffstat (limited to 'src/nm-config-data.c')
| -rw-r--r-- | src/nm-config-data.c | 342 |
1 files changed, 203 insertions, 139 deletions
diff --git a/src/nm-config-data.c b/src/nm-config-data.c index 23c4cecd..0d554e55 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -26,10 +26,12 @@ #include <string.h> #include "nm-config.h" -#include "nm-device.h" +#include "devices/nm-device.h" #include "nm-core-internal.h" #include "nm-keyfile-internal.h" +/*****************************************************************************/ + typedef struct { char *group_name; gboolean stop_match; @@ -42,6 +44,33 @@ typedef struct { } match_device; } MatchSectionInfo; +struct _NMGlobalDnsDomain { + char *name; + char **servers; + char **options; +}; + +struct _NMGlobalDnsConfig { + char **searches; + char **options; + GHashTable *domains; + char **domain_list; + gboolean internal; +}; + +/*****************************************************************************/ + +NM_GOBJECT_PROPERTIES_DEFINE_BASE ( + PROP_CONFIG_MAIN_FILE, + PROP_CONFIG_DESCRIPTION, + PROP_KEYFILE_USER, + PROP_KEYFILE_INTERN, + PROP_CONNECTIVITY_URI, + PROP_CONNECTIVITY_INTERVAL, + PROP_CONNECTIVITY_RESPONSE, + PROP_NO_AUTO_DEFAULT, +); + typedef struct { char *config_main_file; char *config_description; @@ -82,40 +111,20 @@ typedef struct { char *value_cached; } NMConfigDataPrivate; -struct _NMGlobalDnsDomain { - char *name; - char **servers; - char **options; +struct _NMConfigData { + GObject parent; + NMConfigDataPrivate _priv; }; -struct _NMGlobalDnsConfig { - char **searches; - char **options; - GHashTable *domains; - char **domain_list; - gboolean internal; -}; - -enum { - PROP_0, - PROP_CONFIG_MAIN_FILE, - PROP_CONFIG_DESCRIPTION, - PROP_KEYFILE_USER, - PROP_KEYFILE_INTERN, - PROP_CONNECTIVITY_URI, - PROP_CONNECTIVITY_INTERVAL, - PROP_CONNECTIVITY_RESPONSE, - PROP_NO_AUTO_DEFAULT, - - LAST_PROP +struct _NMConfigDataClass { + GObjectClass parent; }; - G_DEFINE_TYPE (NMConfigData, nm_config_data, G_TYPE_OBJECT) -#define NM_CONFIG_DATA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CONFIG_DATA, NMConfigDataPrivate)) +#define NM_CONFIG_DATA_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMConfigData, NM_IS_CONFIG_DATA) -/************************************************************************/ +/*****************************************************************************/ #define _HAS_PREFIX(str, prefix) \ ({ \ @@ -123,7 +132,7 @@ G_DEFINE_TYPE (NMConfigData, nm_config_data, G_TYPE_OBJECT) g_str_has_prefix ( _str, ""prefix"") && _str[NM_STRLEN(prefix)] != '\0'; \ }) -/************************************************************************/ +/*****************************************************************************/ const char * nm_config_data_get_config_main_file (const NMConfigData *self) @@ -162,7 +171,7 @@ nm_config_data_get_value (const NMConfigData *self, const char *group, const cha const char *nm_config_data_get_value_cached (const NMConfigData *self, const char *group, const char *key, NMConfigGetValueFlags flags) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; g_return_val_if_fail (NM_IS_CONFIG_DATA (self), NULL); g_return_val_if_fail (group && *group, NULL); @@ -171,8 +180,8 @@ const char *nm_config_data_get_value_cached (const NMConfigData *self, const cha priv = NM_CONFIG_DATA_GET_PRIVATE (self); /* we modify @value_cached. In C++ jargon, the field is mutable. */ - g_free (priv->value_cached); - priv->value_cached = nm_config_keyfile_get_value (priv->keyfile, group, key, flags); + g_free (((NMConfigDataPrivate *) priv)->value_cached); + ((NMConfigDataPrivate *) priv)->value_cached = nm_config_keyfile_get_value (priv->keyfile, group, key, flags); return priv->value_cached; } @@ -208,6 +217,27 @@ nm_config_data_get_value_boolean (const NMConfigData *self, const char *group, c return value; } +char ** +nm_config_data_get_plugins (const NMConfigData *self, gboolean allow_default) +{ + const NMConfigDataPrivate *priv; + char **list; + + g_return_val_if_fail (self, NULL); + + priv = NM_CONFIG_DATA_GET_PRIVATE (self); + + list = g_key_file_get_string_list (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, NULL); + if (!list && allow_default) { + gs_unref_keyfile GKeyFile *kf = nm_config_create_keyfile (); + + /* let keyfile split the default string according to it's own escaping rules. */ + g_key_file_set_value (kf, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NM_CONFIG_DEFAULT_MAIN_PLUGINS); + list = g_key_file_get_string_list (kf, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, NULL); + } + return _nm_utils_strv_cleanup (list, TRUE, TRUE, TRUE); +} + const char * nm_config_data_get_connectivity_uri (const NMConfigData *self) { @@ -243,7 +273,7 @@ nm_config_data_get_no_auto_default (const NMConfigData *self) gboolean nm_config_data_get_no_auto_default_for_device (const NMConfigData *self, NMDevice *device) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE); g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); @@ -297,7 +327,7 @@ nm_config_data_get_assume_ipv6ll_only (const NMConfigData *self, NMDevice *devic GKeyFile * nm_config_data_clone_keyfile_intern (const NMConfigData *self) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; GKeyFile *keyfile; g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE); @@ -328,7 +358,7 @@ _nm_config_data_get_keyfile_user (const NMConfigData *self) return NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile_user; } -/************************************************************************/ +/*****************************************************************************/ /** * nm_config_data_get_groups: @@ -373,7 +403,7 @@ nm_config_data_get_keys (const NMConfigData *self, const char *group) gboolean nm_config_data_is_intern_atomic_group (const NMConfigData *self, const char *group) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE); g_return_val_if_fail (group && *group, FALSE); @@ -391,7 +421,7 @@ nm_config_data_is_intern_atomic_group (const NMConfigData *self, const char *gro return g_key_file_has_group (priv->keyfile, group); } -/************************************************************************/ +/*****************************************************************************/ static GKeyFile * _merge_keyfiles (GKeyFile *keyfile_user, GKeyFile *keyfile_intern) @@ -456,7 +486,7 @@ _merge_keyfiles (GKeyFile *keyfile_user, GKeyFile *keyfile_intern) return keyfile; } -/************************************************************************/ +/*****************************************************************************/ static int _nm_config_data_log_sort (const char **pa, const char **pb, gpointer dummy) @@ -464,6 +494,7 @@ _nm_config_data_log_sort (const char **pa, const char **pb, gpointer dummy) gboolean a_is_connection, b_is_connection; gboolean a_is_device, b_is_device; gboolean a_is_intern, b_is_intern; + gboolean a_is_main, b_is_main; const char *a = *pa; const char *b = *pb; @@ -522,9 +553,26 @@ _nm_config_data_log_sort (const char **pa, const char **pb, gpointer dummy) if (b_is_device && !a_is_device) return -1; - /* no reordering. */ - return 0; -} + a_is_main = nm_streq0 (a, "main"); + b_is_main = nm_streq0 (b, "main"); + if (a_is_main != b_is_main) + return a_is_main ? -1 : 1; + + return g_strcmp0 (a, b); +} + +static struct { + const char *group; + const char *key; + const char *value; +} default_values[] = { + { NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NM_CONFIG_DEFAULT_MAIN_PLUGINS }, + { NM_CONFIG_KEYFILE_GROUP_MAIN, "rc-manager", NM_CONFIG_DEFAULT_MAIN_RC_MANAGER }, + { NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_AUTH_POLKIT, NM_CONFIG_DEFAULT_MAIN_AUTH_POLKIT }, + { NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_DHCP, NM_CONFIG_DEFAULT_MAIN_DHCP }, + { NM_CONFIG_KEYFILE_GROUP_LOGGING, "backend", NM_CONFIG_DEFAULT_LOGGING_BACKEND }, + { NM_CONFIG_KEYFILE_GROUP_LOGGING, "audit", NM_CONFIG_DEFAULT_LOGGING_AUDIT }, +}; void nm_config_data_log (const NMConfigData *self, @@ -532,11 +580,13 @@ nm_config_data_log (const NMConfigData *self, const char *key_prefix, /* FILE* */ gpointer print_stream) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; gs_strfreev char **groups = NULL; gsize ngroups; - guint g, k; + guint g, k, i; FILE *stream = print_stream; + gs_unref_ptrarray GPtrArray *groups_full = NULL; + gboolean print_default = !!stream; g_return_if_fail (NM_IS_CONFIG_DATA (self)); @@ -562,18 +612,35 @@ nm_config_data_log (const NMConfigData *self, if (!groups) ngroups = 0; - if (groups && groups[0]) { - g_qsort_with_data (groups, ngroups, - sizeof (char *), - (GCompareDataFunc) _nm_config_data_log_sort, - NULL); + groups_full = g_ptr_array_sized_new (ngroups + 5); + + if (ngroups) { + g_ptr_array_set_size (groups_full, ngroups); + memcpy (groups_full->pdata, groups, sizeof (groups[0]) * ngroups); + g_ptr_array_sort_with_data (groups_full, (GCompareDataFunc) _nm_config_data_log_sort, NULL); + } + + if (print_default) { + for (g = 0; g < G_N_ELEMENTS (default_values); g++) { + const char *group = default_values[g].group; + gssize idx; + + idx = _nm_utils_array_find_binary_search ((gconstpointer *) groups_full->pdata, + sizeof (char *), + groups_full->len, + &group, + (GCompareDataFunc) _nm_config_data_log_sort, + NULL); + if (idx < 0) + g_ptr_array_insert (groups_full, (~idx), (gpointer) group); + } } if (!stream) - _LOG (stream, prefix, "config-data[%p]: %lu groups", self, (unsigned long) ngroups); + _LOG (stream, prefix, "config-data[%p]: %u groups", self, groups_full->len); - for (g = 0; g < ngroups; g++) { - const char *group = groups[g]; + for (g = 0; g < groups_full->len; g++) { + const char *group = groups_full->pdata[g]; gs_strfreev char **keys = NULL; gboolean is_atomic; @@ -582,6 +649,17 @@ nm_config_data_log (const NMConfigData *self, _LOG (stream, prefix, ""); _LOG (stream, prefix, "[%s]%s", group, is_atomic && !stream ? " # atomic section" : ""); + /* Print default values as comments */ + if (print_default) { + for (i = 0; i < G_N_ELEMENTS (default_values); i++) { + if ( nm_streq (default_values[i].group, group) + && !g_key_file_has_key (priv->keyfile, group, default_values[i].key, NULL)) { + _LOG (stream, prefix, "%s# %s=%s", key_prefix, default_values[i].key, + default_values[i].value); + } + } + } + keys = g_key_file_get_keys (priv->keyfile, group, NULL, NULL); for (k = 0; keys && keys[k]; k++) { const char *key = keys[k]; @@ -595,7 +673,7 @@ nm_config_data_log (const NMConfigData *self, #undef _LOG } -/************************************************************************/ +/*****************************************************************************/ const char *const * nm_global_dns_config_get_searches (const NMGlobalDnsConfig *dns) @@ -1081,7 +1159,7 @@ global_dns_equal (NMGlobalDnsConfig *old, NMGlobalDnsConfig *new) return TRUE; } -/************************************************************************/ +/*****************************************************************************/ static const MatchSectionInfo * _match_section_infos_lookup (const MatchSectionInfo *match_section_infos, @@ -1127,7 +1205,7 @@ nm_config_data_get_device_config (const NMConfigData *self, NMDevice *device, gboolean *has_match) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; const MatchSectionInfo *connection_info; char *value = NULL; @@ -1166,7 +1244,7 @@ nm_config_data_get_connection_default (const NMConfigData *self, const char *property, NMDevice *device) { - NMConfigDataPrivate *priv; + const NMConfigDataPrivate *priv; char *value = NULL; g_return_val_if_fail (self, NULL); @@ -1261,7 +1339,7 @@ _match_section_infos_construct (GKeyFile *keyfile, const char *prefix) return match_section_infos; } -/************************************************************************/ +/*****************************************************************************/ static gboolean _slist_str_equals (GSList *a, GSList *b) @@ -1318,7 +1396,7 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data) return changes; } -/************************************************************************/ +/*****************************************************************************/ static void get_property (GObject *object, @@ -1409,47 +1487,7 @@ set_property (GObject *object, } } -static void -dispose (GObject *object) -{ -} - -static void -finalize (GObject *gobject) -{ - NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (gobject); - - g_free (priv->config_main_file); - g_free (priv->config_description); - - g_free (priv->connectivity.uri); - g_free (priv->connectivity.response); - - g_slist_free_full (priv->no_auto_default.specs, g_free); - g_slist_free_full (priv->no_auto_default.specs_config, g_free); - g_strfreev (priv->no_auto_default.arr); - - g_free (priv->dns_mode); - g_free (priv->rc_manager); - - g_slist_free_full (priv->ignore_carrier, g_free); - g_slist_free_full (priv->assume_ipv6ll_only, g_free); - - nm_global_dns_config_free (priv->global_dns); - - _match_section_infos_free (priv->connection_infos); - _match_section_infos_free (priv->device_infos); - - g_key_file_unref (priv->keyfile); - if (priv->keyfile_user) - g_key_file_unref (priv->keyfile_user); - if (priv->keyfile_intern) - g_key_file_unref (priv->keyfile_intern); - - G_OBJECT_CLASS (nm_config_data_parent_class)->finalize (gobject); - - g_free (priv->value_cached); -} +/*****************************************************************************/ static void nm_config_data_init (NMConfigData *self) @@ -1513,7 +1551,7 @@ nm_config_data_new (const char *config_main_file, NMConfigData * nm_config_data_new_update_keyfile_intern (const NMConfigData *base, GKeyFile *keyfile_intern) { - NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (base); + const 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, @@ -1528,7 +1566,7 @@ 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); + const 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, @@ -1540,78 +1578,104 @@ nm_config_data_new_update_no_auto_default (const NMConfigData *base, } static void +finalize (GObject *gobject) +{ + NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE ((NMConfigData *) gobject); + + g_free (priv->config_main_file); + g_free (priv->config_description); + + g_free (priv->connectivity.uri); + g_free (priv->connectivity.response); + + g_slist_free_full (priv->no_auto_default.specs, g_free); + g_slist_free_full (priv->no_auto_default.specs_config, g_free); + g_strfreev (priv->no_auto_default.arr); + + g_free (priv->dns_mode); + g_free (priv->rc_manager); + + g_slist_free_full (priv->ignore_carrier, g_free); + g_slist_free_full (priv->assume_ipv6ll_only, g_free); + + nm_global_dns_config_free (priv->global_dns); + + _match_section_infos_free (priv->connection_infos); + _match_section_infos_free (priv->device_infos); + + g_key_file_unref (priv->keyfile); + if (priv->keyfile_user) + g_key_file_unref (priv->keyfile_user); + if (priv->keyfile_intern) + g_key_file_unref (priv->keyfile_intern); + + G_OBJECT_CLASS (nm_config_data_parent_class)->finalize (gobject); + + g_free (priv->value_cached); +} + +static void nm_config_data_class_init (NMConfigDataClass *config_class) { GObjectClass *object_class = G_OBJECT_CLASS (config_class); - g_type_class_add_private (config_class, sizeof (NMConfigDataPrivate)); - object_class->constructed = constructed; - object_class->dispose = dispose; object_class->finalize = finalize; object_class->get_property = get_property; object_class->set_property = set_property; - g_object_class_install_property - (object_class, PROP_CONFIG_MAIN_FILE, + obj_properties[PROP_CONFIG_MAIN_FILE] = g_param_spec_string (NM_CONFIG_DATA_CONFIG_MAIN_FILE, "", "", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); + G_PARAM_STATIC_STRINGS); - g_object_class_install_property - (object_class, PROP_CONFIG_DESCRIPTION, + obj_properties[PROP_CONFIG_DESCRIPTION] = g_param_spec_string (NM_CONFIG_DATA_CONFIG_DESCRIPTION, "", "", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_KEYFILE_USER, - g_param_spec_boxed (NM_CONFIG_DATA_KEYFILE_USER, "", "", - G_TYPE_KEY_FILE, - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_KEYFILE_INTERN, - g_param_spec_boxed (NM_CONFIG_DATA_KEYFILE_INTERN, "", "", - G_TYPE_KEY_FILE, - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_CONNECTIVITY_URI, + G_PARAM_STATIC_STRINGS); + + obj_properties[PROP_KEYFILE_USER] = + g_param_spec_boxed (NM_CONFIG_DATA_KEYFILE_USER, "", "", + G_TYPE_KEY_FILE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + obj_properties[PROP_KEYFILE_INTERN] = + g_param_spec_boxed (NM_CONFIG_DATA_KEYFILE_INTERN, "", "", + G_TYPE_KEY_FILE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + obj_properties[PROP_CONNECTIVITY_URI] = g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_URI, "", "", NULL, G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + G_PARAM_STATIC_STRINGS); - g_object_class_install_property - (object_class, PROP_CONNECTIVITY_INTERVAL, + obj_properties[PROP_CONNECTIVITY_INTERVAL] = g_param_spec_uint (NM_CONFIG_DATA_CONNECTIVITY_INTERVAL, "", "", 0, G_MAXUINT, 0, G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + G_PARAM_STATIC_STRINGS); - g_object_class_install_property - (object_class, PROP_CONNECTIVITY_RESPONSE, + obj_properties[PROP_CONNECTIVITY_RESPONSE] = g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_RESPONSE, "", "", NULL, G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + G_PARAM_STATIC_STRINGS); - g_object_class_install_property - (object_class, PROP_NO_AUTO_DEFAULT, + obj_properties[PROP_NO_AUTO_DEFAULT] = g_param_spec_boxed (NM_CONFIG_DATA_NO_AUTO_DEFAULT, "", "", G_TYPE_STRV, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); } - |