mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-24 14:50:07 +01:00
- previously, writer would use nm_keyfile_plugin_kf_set_integer() for
G_TYPE_UINT types.
That means, values larger than G_MAXINT would be stored as negative
values. On the other hand, the reader would always reject negative
values.
Fix that, by parsing the integer ourself.
Note that we still reject the old (negative) values and there is no
compatibility for accepting such values. They were not accepted by
reader in the past and so they are still rejected.
This affects for example ethernet.mtu setting (arguably, the MTU
is usually set to small values where the issue was not apparent).
This is also covered by a test.
- no longer use nm_keyfile_plugin_kf_set_integer().
nm_keyfile_plugin_kf_set_integer() calls g_key_file_get_integer(), which
uses g_key_file_parse_integer_as_value(). That one has the odd
behavior of accepting "<number><whitespace><bogus>" as valid. Note how that
differs from g_key_file_parse_value_as_double() which rejects trailing data.
Implement the parsing ourself. There are some changes here:
- g_key_file_parse_value_as_integer() uses strtol() with base 10.
We no longer require a certain the base, so '0x' hex values are allowed
now as well.
- bogus suffixes are now rejected but were accepted by g_key_file_parse_value_as_integer().
We however still accept leading and trailing whitespace, as before.
- use nm_g_object_set_property*(). g_object_set() asserts that the value
is in range. We cannot pass invalid values without checking that they
are valid.
- emit warnings when values cannot be parsed. Previously they would
have been silently ignored or fail an assertion during g_object_set().
- don't use "helpers" like nm_keyfile_plugin_kf_set_uint64(). These
merely call GKeyFile's setters (taking care of aliases). The setters
of GKeyFile don't do anything miraculously, they merely call
g_key_file_set_value() with the string that one would expect.
Convert the numbers/boolean ourselfs. For one, we don't require
a heap allocation to convert a number to string. Also, there is
no point in leaving this GKeyFile API, because even if GKeyFile
day would change, we still must continue to support the present
format, as that is what users have on disk. So, even if a new
way would be implemented by GKeyFile, the current way must forever
be accepted too. Hence, we don't need this abstraction.
99 lines
4.4 KiB
C
99 lines
4.4 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
|
/* NetworkManager system settings service
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* (C) Copyright 2010-2015 Red Hat, Inc.
|
|
*/
|
|
|
|
#ifndef __NM_KEYFILE_UTILS_H__
|
|
#define __NM_KEYFILE_UTILS_H__
|
|
|
|
#if !((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_PRIVATE)
|
|
#error Cannot use this header.
|
|
#endif
|
|
|
|
#define NM_KEYFILE_GROUP_VPN_SECRETS "vpn-secrets"
|
|
|
|
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);
|
|
|
|
/*****************************************************************************/
|
|
|
|
/* List helpers */
|
|
#define DEFINE_KF_LIST_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
|
|
get_ctype nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
|
|
const char *group, \
|
|
const char *key, \
|
|
gsize *out_length, \
|
|
GError **error); \
|
|
\
|
|
void nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
|
|
const char *group, \
|
|
const char *key, \
|
|
set_ctype list[], \
|
|
gsize length);
|
|
DEFINE_KF_LIST_WRAPPER_PROTO(integer, int*, int)
|
|
DEFINE_KF_LIST_WRAPPER_PROTO(string, char**, const char* const)
|
|
|
|
void nm_keyfile_plugin_kf_set_integer_list_uint8 (GKeyFile *kf,
|
|
const char *group,
|
|
const char *key,
|
|
const guint8 *list,
|
|
gsize length);
|
|
|
|
/* Single-value helpers */
|
|
#define DEFINE_KF_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
|
|
get_ctype nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
|
|
const char *group, \
|
|
const char *key, \
|
|
GError **error); \
|
|
\
|
|
void nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
|
|
const char *group, \
|
|
const char *key, \
|
|
set_ctype value);
|
|
DEFINE_KF_WRAPPER_PROTO(string, char*, const char*)
|
|
DEFINE_KF_WRAPPER_PROTO(boolean, gboolean, gboolean)
|
|
DEFINE_KF_WRAPPER_PROTO(value, char*, const char*)
|
|
|
|
/* Misc */
|
|
gint64 nm_keyfile_plugin_kf_get_int64 (GKeyFile *kf,
|
|
const char *group,
|
|
const char *key,
|
|
guint base,
|
|
gint64 min,
|
|
gint64 max,
|
|
gint64 fallback,
|
|
GError **error);
|
|
|
|
char ** nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
|
|
const char *group,
|
|
gsize *out_length,
|
|
GError **error);
|
|
|
|
gboolean nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
|
|
const char *group,
|
|
const char *key,
|
|
GError **error);
|
|
|
|
const char *nm_keyfile_key_encode (const char *name,
|
|
char **out_to_free);
|
|
|
|
const char *nm_keyfile_key_decode (const char *key,
|
|
char **out_to_free);
|
|
|
|
#endif /* __NM_KEYFILE_UTILS_H__ */
|