nm-utils-private.h 9.54 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301 USA.
 *
18
 * Copyright 2005 - 2017 Red Hat, Inc.
19 20 21 22 23
 */

#ifndef __NM_UTILS_PRIVATE_H__
#define __NM_UTILS_PRIVATE_H__

24 25
#if !((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_PRIVATE)
#error Cannot use this header.
26 27
#endif

28
#include "nm-setting-private.h"
29
#include "nm-setting-ip-config.h"
30

31 32 33
struct _NMVariantAttributeSpec {
	char *name;
	const GVariantType *type;
34 35
	bool v4:1;
	bool v6:1;
36 37
	bool no_value:1;
	bool consumes_rest:1;
38
	char str_type;
39 40
};

41 42 43 44 45 46 47
#define NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(_name, _type, ...) \
	(&((const NMVariantAttributeSpec) { \
		.name          = _name, \
		.type          = _type, \
		__VA_ARGS__ \
	}))

48 49 50
gboolean    _nm_utils_string_slist_validate (GSList *list,
                                             const char **valid_values);

51 52 53 54 55 56
gboolean _nm_utils_secret_flags_validate (NMSettingSecretFlags secret_flags,
                                          const char *setting_name,
                                          const char *property_name,
                                          NMSettingSecretFlags disallowed_flags,
                                          GError **error);

57 58 59 60 61 62
gboolean _nm_utils_wps_method_validate (NMSettingWirelessSecurityWpsMethod wps_method,
                                        const char *setting_name,
                                        const char *property_name,
                                        gboolean wps_required,
                                        GError **error);

63
/* D-Bus transform funcs */
64

65 66 67 68 69
GVariant *_nm_utils_hwaddr_cloned_get (const NMSettInfoSetting *sett_info,
                                       guint property_idx,
                                       NMConnection *connection,
                                       NMSetting *setting,
                                       NMConnectionSerializationFlags flags);
70 71 72 73 74 75 76 77 78 79 80
gboolean    _nm_utils_hwaddr_cloned_set (NMSetting     *setting,
                                         GVariant      *connection_dict,
                                         const char    *property,
                                         GVariant      *value,
                                         NMSettingParseFlags parse_flags,
                                         GError       **error);
gboolean    _nm_utils_hwaddr_cloned_not_set (NMSetting *setting,
                                             GVariant      *connection_dict,
                                             const char    *property,
                                             NMSettingParseFlags parse_flags,
                                             GError       **error);
81 82
GVariant *  _nm_utils_hwaddr_cloned_data_synth (const NMSettInfoSetting *sett_info,
                                                guint property_idx,
83
                                                NMConnection *connection,
84 85
                                                NMSetting *setting,
                                                NMConnectionSerializationFlags flags);
86 87 88 89 90 91 92
gboolean    _nm_utils_hwaddr_cloned_data_set (NMSetting *setting,
                                              GVariant *connection_dict,
                                              const char *property,
                                              GVariant *value,
                                              NMSettingParseFlags parse_flags,
                                              GError **error);

93 94
GVariant *  _nm_utils_hwaddr_to_dbus   (const GValue *prop_value);
void        _nm_utils_hwaddr_from_dbus (GVariant *dbus_value,
95 96
                                        GValue *prop_value);

97 98
GVariant *  _nm_utils_strdict_to_dbus   (const GValue *prop_value);
void        _nm_utils_strdict_from_dbus (GVariant *dbus_value,
99 100
                                         GValue *prop_value);

101
void        _nm_utils_bytes_from_dbus   (GVariant *dbus_value,
102 103
                                         GValue *prop_value);

104 105
char *      _nm_utils_hwaddr_canonical_or_invalid (const char *mac, gssize length);

106 107
GPtrArray * _nm_utils_team_link_watchers_from_variant (GVariant *value);
GVariant *  _nm_utils_team_link_watchers_to_variant (GPtrArray *link_watchers);
108

109 110 111 112 113
void        _nm_utils_format_variant_attributes_full (GString *str,
                                                      const NMUtilsNamedValue *values,
                                                      guint num_values,
                                                      char attr_separator,
                                                      char key_value_separator);
114
gboolean    _nm_sriov_vf_parse_vlans (NMSriovVF *vf, const char *str, GError **error);
115

116 117 118 119 120 121
GVariant *  _nm_utils_bridge_vlans_to_dbus (const NMSettInfoSetting *sett_info,
                                            guint property_idx,
                                            NMConnection *connection,
                                            NMSetting *setting,
                                            NMConnectionSerializationFlags flags);

122 123 124 125 126 127 128 129 130 131 132 133
gboolean    _nm_utils_bridge_vlans_from_dbus (NMSetting *setting,
                                              GVariant *connection_dict,
                                              const char *property,
                                              GVariant *value,
                                              NMSettingParseFlags parse_flags,
                                              GError **error);
gboolean    _nm_utils_bridge_vlan_verify_list (GPtrArray *vlans,
                                               gboolean check_normalizable,
                                               GError **error,
                                               const char *setting,
                                               const char *property);

134 135
/* JSON to GValue conversion macros */

136 137 138 139 140 141 142 143 144 145
static inline void
_nm_auto_unset_and_free_gvalue (GValue **ptr)
{
	if (*ptr) {
		g_value_unset (*ptr);
		g_free (*ptr);
	}
}
#define nm_auto_unset_and_free_gvalue nm_auto(_nm_auto_unset_and_free_gvalue)

146 147 148 149
typedef struct {
	const char *key1;
	const char *key2;
	const char *key3;
150 151 152 153 154
	union {
		int default_int;
		gboolean default_bool;
		const char *default_str;
	};
155 156 157 158
} _NMUtilsTeamPropertyKeys;

static inline int
_nm_utils_json_extract_int (char *conf,
159 160
                            _NMUtilsTeamPropertyKeys key,
                            gboolean is_port)
161
{
162
	nm_auto_unset_and_free_gvalue GValue *t_value = NULL;
163

164
	t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port);
165 166
	if (   !t_value
	    || !G_VALUE_HOLDS_INT (t_value))
167
		return key.default_int;
168
	return g_value_get_int (t_value);
169 170 171 172
}

static inline gboolean
_nm_utils_json_extract_boolean (char *conf,
173 174
                                _NMUtilsTeamPropertyKeys key,
                                gboolean is_port)
175
{
176
	nm_auto_unset_and_free_gvalue GValue *t_value = NULL;
177

178
	t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port);
179 180
	if (   !t_value
	    || !G_VALUE_HOLDS_BOOLEAN (t_value))
181
		return key.default_bool;
182
	return g_value_get_boolean (t_value);
183 184 185 186
}

static inline char *
_nm_utils_json_extract_string (char *conf,
187 188
                               _NMUtilsTeamPropertyKeys key,
                               gboolean is_port)
189
{
190
	nm_auto_unset_and_free_gvalue GValue *t_value = NULL;
191

192
	t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port);
193 194
	if (   !t_value
	    || !G_VALUE_HOLDS_STRING (t_value))
195
		return g_strdup (key.default_str);
196
	return g_value_dup_string (t_value);
197 198 199 200
}

static inline char **
_nm_utils_json_extract_strv (char *conf,
201 202
                             _NMUtilsTeamPropertyKeys key,
                             gboolean is_port)
203
{
204
	nm_auto_unset_and_free_gvalue GValue *t_value = NULL;
205

206
	t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port);
207 208
	if (   !t_value
	    || !G_TYPE_CHECK_VALUE_TYPE (t_value, G_TYPE_STRV))
209
		return NULL;
210 211
	return    g_strdupv (g_value_get_boxed (t_value))
	       ?: g_new0 (char *, 1);
212 213
}

214 215
static inline GPtrArray *
_nm_utils_json_extract_ptr_array (char *conf,
216 217
                                  _NMUtilsTeamPropertyKeys key,
                                  gboolean is_port)
218
{
219
	nm_auto_unset_and_free_gvalue GValue *t_value = NULL;
220 221 222 223
	GPtrArray *data, *ret;
	guint i;

	ret = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_team_link_watcher_unref);
224

225
	t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port);
226 227
	if (   !t_value
	    || !G_TYPE_CHECK_VALUE_TYPE (t_value, G_TYPE_PTR_ARRAY))
228 229 230 231 232 233 234 235 236 237
		return ret;

	data = g_value_get_boxed (t_value);
	if (!data)
		return ret;
	for (i = 0; i < data->len; i++)
		g_ptr_array_add (ret, nm_team_link_watcher_dup (data->pdata[i]));
	return ret;
}

238 239 240 241 242 243 244 245
static inline void
_nm_utils_json_append_gvalue (char **conf,
                              _NMUtilsTeamPropertyKeys key,
                              const GValue *val)
{
	_nm_utils_team_config_set (conf, key.key1, key.key2, key.key3, val);
}

246
#endif