From 5eeaf4df9126f13407917420cc96dbda96d45069 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 9 Jun 2015 09:02:32 +0200 Subject: [PATCH] config: add nm_config_parse_boolean() function Add function to parse as boolean according our NMConfig convention. Split this out from nm_config_keyfile_get_boolean() so that we can use it independently. Also, change the return type to gint, so that one might pass -1 to indicate an invalid/missing boolean value. Thereby also don't log a warning in nm_config_keyfile_get_boolean() We don't want to log a warning every time we access a keyfile value. If we want to warn about invalid values, we should do it once after the configuration is loaded. And then we should not only do it for booleans, but for other types as well. (cherry picked from commit 35d2981546911f7f6e29c845eaca95a8973d7004) --- src/nm-config.c | 57 +++++++++++++++++++++++++++++++------------------ src/nm-config.h | 18 +++++++++------- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/nm-config.c b/src/nm-config.c index 3733a43a16..3b92bfb287 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -108,37 +108,52 @@ static void _set_config_data (NMConfig *self, NMConfigData *new_data, int signal /************************************************************************/ -gboolean +gint +nm_config_parse_boolean (const char *str, + gint default_value) +{ + gsize len; + char *s = NULL; + + if (!str) + return default_value; + + while (str[0] && g_ascii_isspace (str[0])) + str++; + + if (!str[0]) + return default_value; + + len = strlen (str); + if (g_ascii_isspace (str[len - 1])) { + s = g_strdup (str); + g_strchomp (s); + str = s; + } + + if (!g_ascii_strcasecmp (str, "true") || !g_ascii_strcasecmp (str, "yes") || !g_ascii_strcasecmp (str, "on") || !g_ascii_strcasecmp (str, "1")) + default_value = TRUE; + else if (!g_ascii_strcasecmp (str, "false") || !g_ascii_strcasecmp (str, "no") || !g_ascii_strcasecmp (str, "off") || !g_ascii_strcasecmp (str, "0")) + default_value = FALSE; + if (s) + g_free (s); + return default_value; +} + +gint nm_config_keyfile_get_boolean (GKeyFile *keyfile, const char *section, const char *key, - gboolean default_value) + gint default_value) { - gboolean value = default_value; - char *str; + gs_free char *str = NULL; g_return_val_if_fail (keyfile != NULL, default_value); g_return_val_if_fail (section != NULL, default_value); g_return_val_if_fail (key != NULL, default_value); str = g_key_file_get_value (keyfile, section, key, NULL); - if (!str) - return default_value; - - g_strstrip (str); - if (str[0]) { - if (!g_ascii_strcasecmp (str, "true") || !g_ascii_strcasecmp (str, "yes") || !g_ascii_strcasecmp (str, "on") || !g_ascii_strcasecmp (str, "1")) - value = TRUE; - else if (!g_ascii_strcasecmp (str, "false") || !g_ascii_strcasecmp (str, "no") || !g_ascii_strcasecmp (str, "off") || !g_ascii_strcasecmp (str, "0")) - value = FALSE; - else { - nm_log_warn (LOGD_CORE, "Unrecognized value for %s.%s: '%s'. Assuming '%s'", - section, key, str, default_value ? "true" : "false"); - } - } - - g_free (str); - return value; + return nm_config_parse_boolean (str, default_value); } void diff --git a/src/nm-config.h b/src/nm-config.h index 0dadf2e4b4..13c4eeca18 100644 --- a/src/nm-config.h +++ b/src/nm-config.h @@ -95,16 +95,18 @@ NMConfig *nm_config_new (const NMConfigCmdLineOptions *cli, GError **error); NMConfig *nm_config_setup (const NMConfigCmdLineOptions *cli, GError **error); void nm_config_reload (NMConfig *config, int signal); +gint nm_config_parse_boolean (const char *str, gint default_value); + GKeyFile *nm_config_create_keyfile (void); -gboolean nm_config_keyfile_get_boolean (GKeyFile *keyfile, - const char *section, +gint nm_config_keyfile_get_boolean (GKeyFile *keyfile, + const char *section, + const char *key, + gint default_value); +void nm_config_keyfile_set_string_list (GKeyFile *keyfile, + const char *group, const char *key, - gboolean default_value); -void nm_config_keyfile_set_string_list (GKeyFile *keyfile, - const char *group, - const char *key, - const char *const* strv, - gssize len); + const char *const* strv, + gssize len); GSList *nm_config_get_device_match_spec (const GKeyFile *keyfile, const char *group, const char *key); G_END_DECLS