mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-04-22 05:50:49 +02:00
config: merge branch 'th/config-fix-subtract-plugins'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/491
This commit is contained in:
commit
bdac27eb28
7 changed files with 126 additions and 96 deletions
|
|
@ -929,23 +929,38 @@ nm_streq0 (const char *s1, const char *s2)
|
|||
|
||||
#define NM_STR_HAS_PREFIX(str, prefix) \
|
||||
({ \
|
||||
const char *const _str = (str); \
|
||||
const char *const _str_has_prefix = (str); \
|
||||
\
|
||||
_str && (strncmp ((str), ""prefix"", NM_STRLEN (prefix)) == 0); \
|
||||
nm_assert (strlen (prefix) == NM_STRLEN (prefix)); \
|
||||
\
|
||||
_str_has_prefix \
|
||||
&& (strncmp (_str_has_prefix, ""prefix"", NM_STRLEN (prefix)) == 0); \
|
||||
})
|
||||
|
||||
#define NM_STR_HAS_SUFFIX(str, suffix) \
|
||||
({ \
|
||||
const char *_str; \
|
||||
const char *const _str_has_suffix = (str); \
|
||||
gsize _l; \
|
||||
\
|
||||
( (_str = (str)) \
|
||||
&& ((_l = strlen (_str)) >= NM_STRLEN (suffix)) \
|
||||
&& (memcmp (&_str[_l - NM_STRLEN (suffix)], \
|
||||
nm_assert (strlen (suffix) == NM_STRLEN (suffix)); \
|
||||
\
|
||||
( _str_has_suffix \
|
||||
&& ((_l = strlen (_str_has_suffix)) >= NM_STRLEN (suffix)) \
|
||||
&& (memcmp (&_str_has_suffix[_l - NM_STRLEN (suffix)], \
|
||||
""suffix"", \
|
||||
NM_STRLEN (suffix)) == 0)); \
|
||||
})
|
||||
|
||||
/* whether @str starts with the string literal @prefix and is followed by
|
||||
* some other text. It is like NM_STR_HAS_PREFIX() && !nm_streq() together. */
|
||||
#define NM_STR_HAS_PREFIX_WITH_MORE(str, prefix) \
|
||||
({ \
|
||||
const char *const _str_has_prefix_with_more = (str); \
|
||||
\
|
||||
NM_STR_HAS_PREFIX (_str_has_prefix_with_more, ""prefix"") \
|
||||
&& _str_has_prefix_with_more[NM_STRLEN (prefix)] != '\0'; \
|
||||
})
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static inline GString *
|
||||
|
|
|
|||
|
|
@ -926,6 +926,21 @@ _nm_g_slice_free_fcn_define (32)
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Like g_error_matches() however:
|
||||
* - as macro it is always inlined.
|
||||
* - the @domain is usually a error quark getter function that cannot
|
||||
* be inlined. This macro calls the getter only if there is an error (lazy).
|
||||
* - accept a list of allowed codes, instead of only one.
|
||||
*/
|
||||
#define nm_g_error_matches(error, err_domain, ...) \
|
||||
({ \
|
||||
const GError *const _error = (error); \
|
||||
\
|
||||
_error \
|
||||
&& _error->domain == (err_domain) \
|
||||
&& NM_IN_SET (_error->code, __VA_ARGS__); \
|
||||
})
|
||||
|
||||
static inline void
|
||||
nm_g_set_error_take (GError **error, GError *error_take)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ nm_keyfile_plugin_kf_get_string_list (GKeyFile *kf,
|
|||
gsize l;
|
||||
|
||||
list = g_key_file_get_string_list (kf, group, key, &l, &local);
|
||||
if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
|
||||
if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
|
||||
alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
|
||||
if (alias) {
|
||||
g_clear_error (&local);
|
||||
|
|
@ -246,7 +246,7 @@ fcn_name (GKeyFile *kf, \
|
|||
GError *local = NULL; \
|
||||
\
|
||||
val = key_file_get_fcn (kf, group, key, &local); \
|
||||
if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
|
||||
if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
|
||||
alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
|
||||
if (alias) { \
|
||||
g_clear_error (&local); \
|
||||
|
|
@ -323,7 +323,7 @@ nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
|
|||
gsize l;
|
||||
|
||||
keys = g_key_file_get_keys (kf, group, &l, &local);
|
||||
if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
|
||||
if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
|
||||
alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
|
||||
if (alias) {
|
||||
g_clear_error (&local);
|
||||
|
|
@ -351,7 +351,7 @@ nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
|
|||
GError *local = NULL;
|
||||
|
||||
has = g_key_file_has_key (kf, group, key, &local);
|
||||
if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
|
||||
if (nm_g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
|
||||
alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
|
||||
if (alias) {
|
||||
g_clear_error (&local);
|
||||
|
|
|
|||
|
|
@ -10,9 +10,21 @@
|
|||
#error Cannot use this header.
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "nm-glib-aux/nm-shared-utils.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define NM_KEYFILE_GROUP_VPN_SECRETS "vpn-secrets"
|
||||
#define NM_KEYFILE_GROUPPREFIX_WIREGUARD_PEER "wireguard-peer."
|
||||
|
||||
#define nm_keyfile_error_is_not_found(error) \
|
||||
nm_g_error_matches (error, \
|
||||
G_KEY_FILE_ERROR, \
|
||||
G_KEY_FILE_ERROR_GROUP_NOT_FOUND, \
|
||||
G_KEY_FILE_ERROR_KEY_NOT_FOUND)
|
||||
|
||||
const char *nm_keyfile_plugin_get_alias_for_setting_name (const char *setting_name);
|
||||
|
||||
const char *nm_keyfile_plugin_get_setting_name_for_alias (const char *alias);
|
||||
|
|
|
|||
|
|
@ -1622,9 +1622,7 @@ parity_good:
|
|||
out_err:
|
||||
if (!err)
|
||||
return;
|
||||
if ( err->domain == G_KEY_FILE_ERROR
|
||||
&& NM_IN_SET (err->code, G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
|
||||
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||
if (nm_keyfile_error_is_not_found (err)) {
|
||||
/* ignore such errors. The key is not present. */
|
||||
return;
|
||||
}
|
||||
|
|
@ -3154,9 +3152,7 @@ read_one_setting_value (KeyfileReaderInfo *info,
|
|||
g_return_if_reached ();
|
||||
|
||||
if (err) {
|
||||
if ( err->domain == G_KEY_FILE_ERROR
|
||||
&& NM_IN_SET (err->code, G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
|
||||
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||
if (nm_keyfile_error_is_not_found (err)) {
|
||||
/* ignore such errors. The key is not present. */
|
||||
} else {
|
||||
handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include "devices/nm-device.h"
|
||||
#include "nm-core-internal.h"
|
||||
#include "nm-keyfile/nm-keyfile-internal.h"
|
||||
#include "nm-keyfile/nm-keyfile-utils.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
@ -116,14 +117,6 @@ G_DEFINE_TYPE (NMConfigData, nm_config_data, G_TYPE_OBJECT)
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _HAS_PREFIX(str, prefix) \
|
||||
({ \
|
||||
const char *_str = (str); \
|
||||
g_str_has_prefix ( _str, ""prefix"") && _str[NM_STRLEN(prefix)] != '\0'; \
|
||||
})
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
const char *
|
||||
nm_config_data_get_config_main_file (const NMConfigData *self)
|
||||
{
|
||||
|
|
@ -215,6 +208,7 @@ nm_config_data_get_value_int64 (const NMConfigData *self, const char *group, con
|
|||
char **
|
||||
nm_config_data_get_plugins (const NMConfigData *self, gboolean allow_default)
|
||||
{
|
||||
gs_free_error GError *error = NULL;
|
||||
const NMConfigDataPrivate *priv;
|
||||
char **list;
|
||||
|
||||
|
|
@ -222,8 +216,9 @@ nm_config_data_get_plugins (const NMConfigData *self, gboolean allow_default)
|
|||
|
||||
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) {
|
||||
list = g_key_file_get_string_list (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, &error);
|
||||
if ( nm_keyfile_error_is_not_found (error)
|
||||
&& allow_default) {
|
||||
gs_unref_keyfile GKeyFile *kf = nm_config_create_keyfile ();
|
||||
|
||||
/* let keyfile split the default string according to its own escaping rules. */
|
||||
|
|
@ -550,14 +545,14 @@ _merge_keyfiles (GKeyFile *keyfile_user, GKeyFile *keyfile_intern)
|
|||
continue;
|
||||
|
||||
if ( !is_intern && !is_atomic
|
||||
&& _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
&& NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_WAS)];
|
||||
|
||||
if (!g_key_file_has_key (keyfile_intern, group, key_base, NULL))
|
||||
g_key_file_remove_key (keyfile, group, key_base, NULL);
|
||||
continue;
|
||||
}
|
||||
if (!is_intern && !is_atomic && _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET))
|
||||
if (!is_intern && !is_atomic && NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET))
|
||||
continue;
|
||||
|
||||
value = g_key_file_get_value (keyfile_intern, group, key, NULL);
|
||||
|
|
|
|||
133
src/nm-config.c
133
src/nm-config.c
|
|
@ -15,6 +15,7 @@
|
|||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-core-internal.h"
|
||||
#include "nm-keyfile/nm-keyfile-internal.h"
|
||||
#include "nm-keyfile/nm-keyfile-utils.h"
|
||||
|
||||
#define DEFAULT_CONFIG_MAIN_FILE NMCONFDIR "/NetworkManager.conf"
|
||||
#define DEFAULT_CONFIG_DIR NMCONFDIR "/conf.d"
|
||||
|
|
@ -144,14 +145,6 @@ static void _set_config_data (NMConfig *self, NMConfigData *new_data, NMConfigCh
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _HAS_PREFIX(str, prefix) \
|
||||
({ \
|
||||
const char *_str = (str); \
|
||||
g_str_has_prefix ( _str, ""prefix"") && _str[NM_STRLEN(prefix)] != '\0'; \
|
||||
})
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
int
|
||||
nm_config_parse_boolean (const char *str,
|
||||
int default_value)
|
||||
|
|
@ -548,7 +541,7 @@ string_to_configure_and_quit (const char *value, GError **error)
|
|||
if (value == NULL)
|
||||
return NM_CONFIG_CONFIGURE_AND_QUIT_DISABLED;
|
||||
|
||||
if (strcmp (value, "initrd") == 0)
|
||||
if (nm_streq (value, "initrd"))
|
||||
return NM_CONFIG_CONFIGURE_AND_QUIT_INITRD;
|
||||
|
||||
ret = nm_config_parse_boolean (value, NM_CONFIG_CONFIGURE_AND_QUIT_INVALID);
|
||||
|
|
@ -664,15 +657,13 @@ ignore_config_snippet (GKeyFile *keyfile, gboolean is_base_config)
|
|||
static int
|
||||
_sort_groups_cmp (const char **pa, const char **pb, gpointer dummy)
|
||||
{
|
||||
const char *a, *b;
|
||||
const char *a = *pa;
|
||||
const char *b = *pb;
|
||||
gboolean a_is_connection, b_is_connection;
|
||||
gboolean a_is_device, b_is_device;
|
||||
|
||||
a = *pa;
|
||||
b = *pb;
|
||||
|
||||
a_is_connection = g_str_has_prefix (a, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
|
||||
b_is_connection = g_str_has_prefix (b, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
|
||||
a_is_connection = NM_STR_HAS_PREFIX (a, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
|
||||
b_is_connection = NM_STR_HAS_PREFIX (b, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
|
||||
|
||||
if (a_is_connection != b_is_connection) {
|
||||
/* one is a [connection*] entry, the other not. We sort [connection*] entries
|
||||
|
|
@ -689,8 +680,8 @@ _sort_groups_cmp (const char **pa, const char **pb, gpointer dummy)
|
|||
return pa > pb ? -1 : 1;
|
||||
}
|
||||
|
||||
a_is_device = g_str_has_prefix (a, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
|
||||
b_is_device = g_str_has_prefix (b, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
|
||||
a_is_device = NM_STR_HAS_PREFIX (a, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
|
||||
b_is_device = NM_STR_HAS_PREFIX (b, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE);
|
||||
|
||||
if (a_is_device != b_is_device) {
|
||||
/* one is a [device*] entry, the other not. We sort [device*] entries
|
||||
|
|
@ -726,13 +717,13 @@ _nm_config_sort_groups (char **groups, gsize ngroups)
|
|||
static gboolean
|
||||
_setting_is_device_spec (const char *group, const char *key)
|
||||
{
|
||||
#define _IS(group_v, key_v) (strcmp (group, (""group_v)) == 0 && strcmp (key, (""key_v)) == 0)
|
||||
#define _IS(group_v, key_v) (nm_streq (group, ""group_v"") && nm_streq (key, ""key_v""))
|
||||
return _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_NO_AUTO_DEFAULT)
|
||||
|| _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_IGNORE_CARRIER)
|
||||
|| _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_ASSUME_IPV6LL_ONLY)
|
||||
|| _IS (NM_CONFIG_KEYFILE_GROUP_KEYFILE, NM_CONFIG_KEYFILE_KEY_KEYFILE_UNMANAGED_DEVICES)
|
||||
|| (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION) && !strcmp (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE))
|
||||
|| (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE ) && !strcmp (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE));
|
||||
|| (NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION) && nm_streq (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE))
|
||||
|| (NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE ) && nm_streq (key, NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -741,7 +732,7 @@ _setting_is_string_list (const char *group, const char *key)
|
|||
return _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_PLUGINS)
|
||||
|| _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, NM_CONFIG_KEYFILE_KEY_MAIN_DEBUG)
|
||||
|| _IS (NM_CONFIG_KEYFILE_GROUP_LOGGING, NM_CONFIG_KEYFILE_KEY_LOGGING_DOMAINS)
|
||||
|| g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST);
|
||||
|| NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST);
|
||||
#undef _IS
|
||||
}
|
||||
|
||||
|
|
@ -902,15 +893,20 @@ check_config_key (const char *group, const char *key)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
read_config (GKeyFile *keyfile, gboolean is_base_config,
|
||||
const char *dirname, const char *path,
|
||||
GPtrArray *warnings, GError **error)
|
||||
read_config (GKeyFile *keyfile,
|
||||
gboolean is_base_config,
|
||||
const char *dirname,
|
||||
const char *path,
|
||||
GPtrArray *warnings,
|
||||
GError **error)
|
||||
{
|
||||
GKeyFile *kf;
|
||||
char **groups, **keys;
|
||||
gsize ngroups, nkeys;
|
||||
int g, k;
|
||||
gs_unref_keyfile GKeyFile *kf = NULL;
|
||||
gs_strfreev char **groups = NULL;
|
||||
gs_free char *path_free = NULL;
|
||||
gsize ngroups;
|
||||
gsize nkeys;
|
||||
int g;
|
||||
int k;
|
||||
|
||||
g_return_val_if_fail (keyfile, FALSE);
|
||||
g_return_val_if_fail (path, FALSE);
|
||||
|
|
@ -931,14 +927,11 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
kf = nm_config_create_keyfile ();
|
||||
if (!g_key_file_load_from_file (kf, path, G_KEY_FILE_NONE, error)) {
|
||||
g_prefix_error (error, "%s: ", path);
|
||||
g_key_file_free (kf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ignore_config_snippet (kf, is_base_config)) {
|
||||
g_key_file_free (kf);
|
||||
if (ignore_config_snippet (kf, is_base_config))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* the config-group is internal to every configuration snippets. It doesn't make sense
|
||||
* to merge it into the global configuration, and it doesn't make sense to preserve the
|
||||
|
|
@ -962,8 +955,9 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
|
||||
for (g = 0; groups && groups[g]; g++) {
|
||||
const char *group = groups[g];
|
||||
gs_strfreev char **keys = NULL;
|
||||
|
||||
if (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN)) {
|
||||
if (NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN)) {
|
||||
/* internal groups cannot be set by user configuration. */
|
||||
continue;
|
||||
}
|
||||
|
|
@ -971,21 +965,21 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
if (!keys)
|
||||
continue;
|
||||
for (k = 0; keys[k]; k++) {
|
||||
gs_free char *new_value = NULL;
|
||||
const char *key;
|
||||
char *new_value;
|
||||
char last_char;
|
||||
gsize key_len;
|
||||
|
||||
key = keys[k];
|
||||
g_assert (key && *key);
|
||||
nm_assert (key && *key);
|
||||
|
||||
if ( _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)
|
||||
|| _HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
|
||||
if ( NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)
|
||||
|| NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
|
||||
/* these keys are protected. We ignore them if the user sets them. */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS)) {
|
||||
if (nm_streq (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS)) {
|
||||
/* the "was" key is protected and it cannot be set by user configuration. */
|
||||
continue;
|
||||
}
|
||||
|
|
@ -996,6 +990,7 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
&& (last_char == '+' || last_char == '-')) {
|
||||
gs_free char *base_key = g_strndup (key, key_len - 1);
|
||||
gboolean is_string_list;
|
||||
gboolean old_val_was_set = FALSE;
|
||||
|
||||
is_string_list = _setting_is_string_list (group, base_key);
|
||||
|
||||
|
|
@ -1007,13 +1002,19 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
gs_free char **new_val = NULL;
|
||||
|
||||
if (is_string_list) {
|
||||
old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, NULL);
|
||||
gs_free_error GError *old_error = NULL;
|
||||
|
||||
old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, &old_error);
|
||||
new_val = g_key_file_get_string_list (kf, group, key, NULL, NULL);
|
||||
if (!old_val && !g_key_file_has_key (keyfile, group, base_key, NULL)) {
|
||||
/* we must fill the unspecified value with the compile-time default. */
|
||||
if (nm_streq (group, NM_CONFIG_KEYFILE_GROUP_MAIN) && nm_streq (base_key, "plugins")) {
|
||||
if ( nm_streq (group, NM_CONFIG_KEYFILE_GROUP_MAIN)
|
||||
&& nm_streq (base_key, "plugins")) {
|
||||
old_val_was_set = !nm_keyfile_error_is_not_found (old_error);
|
||||
if ( !old_val
|
||||
&& !old_val_was_set) {
|
||||
/* we must fill the unspecified value with the compile-time default. */
|
||||
g_key_file_set_value (keyfile, group, base_key, NM_CONFIG_DEFAULT_MAIN_PLUGINS);
|
||||
old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, NULL);
|
||||
old_val_was_set = TRUE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -1059,7 +1060,7 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
g_key_file_set_value (keyfile, group, base_key, specs_joined);
|
||||
}
|
||||
} else {
|
||||
if (is_string_list)
|
||||
if (is_string_list && !old_val_was_set)
|
||||
g_key_file_remove_key (keyfile, group, base_key, NULL);
|
||||
else
|
||||
g_key_file_set_value (keyfile, group, base_key, "");
|
||||
|
|
@ -1079,12 +1080,8 @@ read_config (GKeyFile *keyfile, gboolean is_base_config,
|
|||
g_strdup_printf ("unknown key '%s' in section [%s] of file '%s'",
|
||||
key, group, path));
|
||||
}
|
||||
g_free (new_value);
|
||||
}
|
||||
g_strfreev (keys);
|
||||
}
|
||||
g_strfreev (groups);
|
||||
g_key_file_free (kf);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -1174,7 +1171,7 @@ _get_config_dir_files (const char *config_dir)
|
|||
if (direnum) {
|
||||
while ((info = g_file_enumerator_next_file (direnum, NULL, NULL))) {
|
||||
name = g_file_info_get_name (info);
|
||||
if (g_str_has_suffix (name, ".conf"))
|
||||
if (NM_STR_HAS_SUFFIX (name, ".conf"))
|
||||
g_ptr_array_add (confs, g_strdup (name));
|
||||
g_object_unref (info);
|
||||
}
|
||||
|
|
@ -1472,14 +1469,14 @@ intern_config_read (const char *filename,
|
|||
const char *group = groups[g];
|
||||
gboolean is_intern, is_atomic;
|
||||
|
||||
if (!strcmp (group, NM_CONFIG_KEYFILE_GROUP_CONFIG))
|
||||
if (nm_streq (group, NM_CONFIG_KEYFILE_GROUP_CONFIG))
|
||||
continue;
|
||||
|
||||
keys = g_key_file_get_keys (keyfile, group, NULL, NULL);
|
||||
if (!keys)
|
||||
continue;
|
||||
|
||||
is_intern = g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
is_intern = NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
is_atomic = !is_intern && _is_atomic_section (atomic_section_prefixes, group);
|
||||
|
||||
if (is_atomic) {
|
||||
|
|
@ -1489,7 +1486,7 @@ intern_config_read (const char *filename,
|
|||
conf_section_is = _keyfile_serialize_section (keyfile_conf, group);
|
||||
conf_section_was = g_key_file_get_string (keyfile, group, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS, NULL);
|
||||
|
||||
if (g_strcmp0 (conf_section_was, conf_section_is) != 0) {
|
||||
if (!nm_streq0 (conf_section_was, conf_section_is)) {
|
||||
/* the section no longer matches. Skip it entirely. */
|
||||
needs_rewrite = TRUE;
|
||||
continue;
|
||||
|
|
@ -1510,10 +1507,10 @@ intern_config_read (const char *filename,
|
|||
has_intern = TRUE;
|
||||
g_key_file_set_value (keyfile_intern, group, key, value_set);
|
||||
} else if (is_atomic) {
|
||||
if (strcmp (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS) == 0)
|
||||
if (nm_streq (key, NM_CONFIG_KEYFILE_KEY_ATOMIC_SECTION_WAS))
|
||||
continue;
|
||||
g_key_file_set_value (keyfile_intern, group, key, value_set);
|
||||
} else if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
|
||||
} else if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
|
||||
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_SET)];
|
||||
gs_free char *value_was = NULL;
|
||||
gs_free char *value_conf = NULL;
|
||||
|
|
@ -1523,7 +1520,7 @@ intern_config_read (const char *filename,
|
|||
value_conf = g_key_file_get_value (keyfile_conf, group, key_base, NULL);
|
||||
value_was = g_key_file_get_value (keyfile, group, key_was, NULL);
|
||||
|
||||
if (g_strcmp0 (value_conf, value_was) != 0) {
|
||||
if (!nm_streq0 (value_conf, value_was)) {
|
||||
/* if value_was is no longer the same as @value_conf, it means the user
|
||||
* changed the configuration since the last write. In this case, we
|
||||
* drop the value. It also means our file is out-of-date, and we should
|
||||
|
|
@ -1533,7 +1530,7 @@ intern_config_read (const char *filename,
|
|||
}
|
||||
has_intern = TRUE;
|
||||
g_key_file_set_value (keyfile_intern, group, key_base, value_set);
|
||||
} else if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
} else if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_WAS)];
|
||||
gs_free char *key_set = g_strdup_printf (NM_CONFIG_KEYFILE_KEYPREFIX_SET"%s", key_base);
|
||||
gs_free char *value_was = NULL;
|
||||
|
|
@ -1548,7 +1545,7 @@ intern_config_read (const char *filename,
|
|||
value_conf = g_key_file_get_value (keyfile_conf, group, key_base, NULL);
|
||||
value_was = g_key_file_get_value (keyfile, group, key, NULL);
|
||||
|
||||
if (g_strcmp0 (value_conf, value_was) != 0) {
|
||||
if (!nm_streq0 (value_conf, value_was)) {
|
||||
/* if value_was is no longer the same as @value_conf, it means the user
|
||||
* changed the configuration since the last write. In this case, we
|
||||
* don't overwrite the user-provided value. It also means our file is
|
||||
|
|
@ -1577,7 +1574,7 @@ out:
|
|||
if (g_key_file_remove_group (keyfile_intern, NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS, NULL))
|
||||
needs_rewrite = TRUE;
|
||||
for (g = 0; groups && groups[g]; g++) {
|
||||
if ( g_str_has_prefix (groups[g], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN)
|
||||
if ( NM_STR_HAS_PREFIX (groups[g], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN)
|
||||
&& groups[g][NM_STRLEN (NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN)]) {
|
||||
g_key_file_remove_group (keyfile_intern, groups[g], NULL);
|
||||
needs_rewrite = TRUE;
|
||||
|
|
@ -1602,12 +1599,12 @@ out:
|
|||
static int
|
||||
_intern_config_write_sort_fcn (const char **a, const char **b, const char *const*atomic_section_prefixes)
|
||||
{
|
||||
const char *g_a = (a ? *a : NULL);
|
||||
const char *g_b = (b ? *b : NULL);
|
||||
const char *g_a = *a;
|
||||
const char *g_b = *b;
|
||||
gboolean a_is, b_is;
|
||||
|
||||
a_is = g_str_has_prefix (g_a, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
b_is = g_str_has_prefix (g_b, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
a_is = NM_STR_HAS_PREFIX (g_a, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
b_is = NM_STR_HAS_PREFIX (g_b, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
|
||||
if (a_is != b_is) {
|
||||
if (a_is)
|
||||
|
|
@ -1668,7 +1665,7 @@ intern_config_write (const char *filename,
|
|||
if (!keys)
|
||||
continue;
|
||||
|
||||
is_intern = g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
is_intern = NM_STR_HAS_PREFIX (group, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN);
|
||||
is_atomic = !is_intern && _is_atomic_section (atomic_section_prefixes, group);
|
||||
|
||||
if (is_atomic) {
|
||||
|
|
@ -1707,16 +1704,16 @@ intern_config_write (const char *filename,
|
|||
else {
|
||||
gs_free char *value_was = NULL;
|
||||
|
||||
if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
|
||||
if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_SET)) {
|
||||
/* Setting a key with .set prefix has no meaning, as these keys
|
||||
* are protected. Just set the value you want to set instead.
|
||||
* Why did this happen?? */
|
||||
g_warn_if_reached ();
|
||||
} else if (_HAS_PREFIX (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
} else if (NM_STR_HAS_PREFIX_WITH_MORE (key, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
const char *key_base = &key[NM_STRLEN (NM_CONFIG_KEYFILE_KEYPREFIX_WAS)];
|
||||
|
||||
if ( _HAS_PREFIX (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_SET)
|
||||
|| _HAS_PREFIX (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
if ( NM_STR_HAS_PREFIX_WITH_MORE (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_SET)
|
||||
|| NM_STR_HAS_PREFIX_WITH_MORE (key_base, NM_CONFIG_KEYFILE_KEYPREFIX_WAS)) {
|
||||
g_warn_if_reached ();
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1735,7 +1732,7 @@ intern_config_write (const char *filename,
|
|||
} else {
|
||||
if (keyfile_conf) {
|
||||
value_was = g_key_file_get_value (keyfile_conf, group, key, NULL);
|
||||
if (g_strcmp0 (value_set, value_was) == 0) {
|
||||
if (nm_streq0 (value_set, value_was)) {
|
||||
/* there is no point in storing the identical value as we have via
|
||||
* user configuration. Skip it. */
|
||||
continue;
|
||||
|
|
@ -1837,7 +1834,7 @@ nm_config_set_global_dns (NMConfig *self, NMGlobalDnsConfig *global_dns, GError
|
|||
g_key_file_remove_group (keyfile, NM_CONFIG_KEYFILE_GROUP_INTERN_GLOBAL_DNS, NULL);
|
||||
groups = g_key_file_get_groups (keyfile, NULL);
|
||||
for (i = 0; groups[i]; i++) {
|
||||
if (g_str_has_prefix (groups[i], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN))
|
||||
if (NM_STR_HAS_PREFIX (groups[i], NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN_GLOBAL_DNS_DOMAIN))
|
||||
g_key_file_remove_group (keyfile, groups[i], NULL);
|
||||
}
|
||||
g_strfreev (groups);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue