1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2017 Red Hat, Inc.
*/
#include "libnm/nm-default-libnm.h"
#include "nm-compat.h"
/*****************************************************************************/
static void
_get_keys_cb(const char *key, const char *val, gpointer user_data)
{
GPtrArray *a = user_data;
g_ptr_array_add(a, g_strdup(key));
}
static const char **
_get_keys(NMSettingVpn *setting, gboolean is_secrets, guint *out_length)
{
guint len;
const char **keys = NULL;
GPtrArray * a;
nm_assert(NM_IS_SETTING_VPN(setting));
if (is_secrets)
len = nm_setting_vpn_get_num_secrets(setting);
else
len = nm_setting_vpn_get_num_data_items(setting);
a = g_ptr_array_sized_new(len + 1);
if (is_secrets)
nm_setting_vpn_foreach_secret(setting, _get_keys_cb, a);
else
nm_setting_vpn_foreach_data_item(setting, _get_keys_cb, a);
len = a->len;
if (len) {
g_ptr_array_sort(a, nm_strcmp_p);
g_ptr_array_add(a, NULL);
keys = g_malloc(a->len * sizeof(gpointer));
memcpy(keys, a->pdata, a->len * sizeof(gpointer));
/* we need to cache the keys *somewhere*. */
g_object_set_qdata_full(G_OBJECT(setting),
is_secrets
? NM_CACHED_QUARK("libnm._nm_setting_vpn_get_secret_keys")
: NM_CACHED_QUARK("libnm._nm_setting_vpn_get_data_keys"),
g_ptr_array_free(a, FALSE),
(GDestroyNotify) g_strfreev);
} else
g_ptr_array_free(a, TRUE);
NM_SET_OUT(out_length, len);
return keys;
}
const char **
_nm_setting_vpn_get_data_keys(NMSettingVpn *setting, guint *out_length)
{
g_return_val_if_fail(NM_IS_SETTING_VPN(setting), NULL);
return _get_keys(setting, FALSE, out_length);
}
const char **
_nm_setting_vpn_get_secret_keys(NMSettingVpn *setting, guint *out_length)
{
g_return_val_if_fail(NM_IS_SETTING_VPN(setting), NULL);
return _get_keys(setting, TRUE, out_length);
}
|