summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/NetworkManagerUtils.c145
-rw-r--r--src/NetworkManagerUtils.h6
-rw-r--r--src/nm-dispatcher.c3
-rw-r--r--src/nm-manager.c3
-rw-r--r--src/settings/nm-agent-manager.c6
-rw-r--r--src/settings/nm-secret-agent.c6
-rw-r--r--src/settings/nm-settings-connection.c11
-rw-r--r--src/settings/nm-settings.c2
-rw-r--r--src/vpn-manager/nm-vpn-connection.c5
9 files changed, 167 insertions, 20 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index b665984fe0..63648e3322 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -46,6 +46,7 @@
#include "nm-setting-wireless-security.h"
#include "nm-manager-auth.h"
#include "nm-posix-signals.h"
+#include "nm-dbus-glib-types.h"
/*
* Some toolchains (E.G. uClibc 0.9.33 and earlier) don't export
@@ -1840,3 +1841,147 @@ nm_utils_ipv6_interface_identfier_get_from_addr (NMUtilsIPv6IfaceId *iid,
memcpy (iid, addr->s6_addr + 8, 8);
}
+/**
+ * nm_utils_connection_hash_to_dict:
+ * @hash: a hashed #NMConnection
+ *
+ * Returns: a (floating) #GVariant equivalent to @hash.
+ */
+GVariant *
+nm_utils_connection_hash_to_dict (GHashTable *hash)
+{
+ GValue val = { 0, };
+ GVariant *variant;
+
+ if (!hash)
+ return NULL;
+
+ g_value_init (&val, DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT);
+ g_value_set_boxed (&val, hash);
+ variant = dbus_g_value_build_g_variant (&val);
+ g_value_unset (&val);
+
+ return variant;
+}
+
+/**
+ * nm_utils_connection_dict_to_hash:
+ * @dict: a #GVariant-serialized #NMConnection
+ *
+ * Returns: a #GHashTable equivalent to @dict.
+ */
+GHashTable *
+nm_utils_connection_dict_to_hash (GVariant *dict)
+{
+ GValue val = { 0, };
+
+ if (!dict)
+ return NULL;
+
+ dbus_g_value_parse_g_variant (dict, &val);
+ return g_value_get_boxed (&val);
+}
+
+GSList *
+nm_utils_ip4_routes_from_gvalue (const GValue *value)
+{
+ GPtrArray *routes;
+ int i;
+ GSList *list = NULL;
+
+ routes = (GPtrArray *) g_value_get_boxed (value);
+ for (i = 0; routes && (i < routes->len); i++) {
+ GArray *array = (GArray *) g_ptr_array_index (routes, i);
+ NMIP4Route *route;
+
+ if (array->len < 4) {
+ g_warning ("Ignoring invalid IP4 route");
+ continue;
+ }
+
+ route = nm_ip4_route_new ();
+ nm_ip4_route_set_dest (route, g_array_index (array, guint32, 0));
+ nm_ip4_route_set_prefix (route, g_array_index (array, guint32, 1));
+ nm_ip4_route_set_next_hop (route, g_array_index (array, guint32, 2));
+ nm_ip4_route_set_metric (route, g_array_index (array, guint32, 3));
+ list = g_slist_prepend (list, route);
+ }
+
+ return g_slist_reverse (list);
+}
+
+static gboolean
+_nm_utils_gvalue_array_validate (GValueArray *elements, guint n_expected, ...)
+{
+ va_list args;
+ GValue *tmp;
+ int i;
+ gboolean valid = FALSE;
+
+ if (n_expected != elements->n_values)
+ return FALSE;
+
+ va_start (args, n_expected);
+ for (i = 0; i < n_expected; i++) {
+ tmp = g_value_array_get_nth (elements, i);
+ if (G_VALUE_TYPE (tmp) != va_arg (args, GType))
+ goto done;
+ }
+ valid = TRUE;
+
+done:
+ va_end (args);
+ return valid;
+}
+
+GSList *
+nm_utils_ip6_routes_from_gvalue (const GValue *value)
+{
+ GPtrArray *routes;
+ int i;
+ GSList *list = NULL;
+
+ routes = (GPtrArray *) g_value_get_boxed (value);
+ for (i = 0; routes && (i < routes->len); i++) {
+ GValueArray *route_values = (GValueArray *) g_ptr_array_index (routes, i);
+ GByteArray *dest, *next_hop;
+ guint prefix, metric;
+ NMIP6Route *route;
+
+ if (!_nm_utils_gvalue_array_validate (route_values, 4,
+ DBUS_TYPE_G_UCHAR_ARRAY,
+ G_TYPE_UINT,
+ DBUS_TYPE_G_UCHAR_ARRAY,
+ G_TYPE_UINT)) {
+ g_warning ("Ignoring invalid IP6 route");
+ continue;
+ }
+
+ dest = g_value_get_boxed (g_value_array_get_nth (route_values, 0));
+ if (dest->len != 16) {
+ g_warning ("%s: ignoring invalid IP6 dest address of length %d",
+ __func__, dest->len);
+ continue;
+ }
+
+ prefix = g_value_get_uint (g_value_array_get_nth (route_values, 1));
+
+ next_hop = g_value_get_boxed (g_value_array_get_nth (route_values, 2));
+ if (next_hop->len != 16) {
+ g_warning ("%s: ignoring invalid IP6 next_hop address of length %d",
+ __func__, next_hop->len);
+ continue;
+ }
+
+ metric = g_value_get_uint (g_value_array_get_nth (route_values, 3));
+
+ route = nm_ip6_route_new ();
+ nm_ip6_route_set_dest (route, (struct in6_addr *)dest->data);
+ nm_ip6_route_set_prefix (route, prefix);
+ nm_ip6_route_set_next_hop (route, (struct in6_addr *)next_hop->data);
+ nm_ip6_route_set_metric (route, metric);
+ list = g_slist_prepend (list, route);
+ }
+
+ return g_slist_reverse (list);
+}
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index 9a31053326..0996276a6e 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -167,4 +167,10 @@ void nm_utils_ipv6_addr_set_interface_identfier (struct in6_addr *addr,
void nm_utils_ipv6_interface_identfier_get_from_addr (NMUtilsIPv6IfaceId *iid,
const struct in6_addr *addr);
+GVariant *nm_utils_connection_hash_to_dict (GHashTable *hash);
+GHashTable *nm_utils_connection_dict_to_hash (GVariant *dict);
+
+GSList *nm_utils_ip4_routes_from_gvalue (const GValue *value);
+GSList *nm_utils_ip6_routes_from_gvalue (const GValue *value);
+
#endif /* __NETWORKMANAGER_UTILS_H__ */
diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c
index d614dd849d..e77cca6f5d 100644
--- a/src/nm-dispatcher.c
+++ b/src/nm-dispatcher.c
@@ -28,7 +28,6 @@
#include "nm-dispatcher-api.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
-#include "nm-utils-private.h"
#include "nm-logging.h"
#include "nm-dbus-manager.h"
#include "nm-device.h"
@@ -475,7 +474,7 @@ _dispatcher_call (DispatcherAction action,
GVariant *connection_dict;
connection_dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_NO_SECRETS);
- connection_hash = _nm_utils_connection_dict_to_hash (connection_dict);
+ connection_hash = nm_utils_connection_dict_to_hash (connection_dict);
g_variant_unref (connection_dict);
connection_props = value_hash_create ();
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 12c1f30a79..462d031e7d 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -52,7 +52,6 @@
#include "nm-manager-auth.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
-#include "nm-utils-private.h"
#include "nm-device-factory.h"
#include "nm-enum-types.h"
#include "nm-sleep-monitor.h"
@@ -3298,7 +3297,7 @@ impl_manager_add_and_activate_connection (NMManager *self,
*/
connection = nm_simple_connection_new ();
if (settings && g_hash_table_size (settings)) {
- GVariant *settings_dict = _nm_utils_connection_hash_to_dict (settings);
+ GVariant *settings_dict = nm_utils_connection_hash_to_dict (settings);
nm_connection_replace_settings (connection, settings_dict, NULL);
g_variant_unref (settings_dict);
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index 6eb2fb30b1..333cbb261e 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -40,7 +40,7 @@
#include "nm-dbus-manager.h"
#include "nm-session-monitor.h"
#include "nm-simple-connection.h"
-#include "nm-utils-private.h"
+#include "NetworkManagerUtils.h"
G_DEFINE_TYPE (NMAgentManager, nm_agent_manager, G_TYPE_OBJECT)
@@ -914,7 +914,7 @@ get_agent_request_secrets (ConnectionRequest *req, gboolean include_system_secre
if (req->existing_secrets) {
GVariant *secrets_dict;
- secrets_dict = _nm_utils_connection_hash_to_dict (req->existing_secrets);
+ secrets_dict = nm_utils_connection_hash_to_dict (req->existing_secrets);
(void) nm_connection_update_secrets (tmp, req->setting_name, secrets_dict, NULL);
g_variant_unref (secrets_dict);
}
@@ -1101,7 +1101,7 @@ get_start (gpointer user_data)
tmp = nm_simple_connection_new_clone (req->connection);
g_assert (tmp);
- secrets_dict = _nm_utils_connection_hash_to_dict (req->existing_secrets);
+ secrets_dict = nm_utils_connection_hash_to_dict (req->existing_secrets);
if (!nm_connection_update_secrets (tmp, req->setting_name, secrets_dict, &error)) {
req_complete_error (parent, error);
g_clear_error (&error);
diff --git a/src/settings/nm-secret-agent.c b/src/settings/nm-secret-agent.c
index 5507de5750..a1c6954ee2 100644
--- a/src/settings/nm-secret-agent.c
+++ b/src/settings/nm-secret-agent.c
@@ -35,7 +35,7 @@
#include "nm-logging.h"
#include "nm-auth-subject.h"
#include "nm-simple-connection.h"
-#include "nm-utils-private.h"
+#include "NetworkManagerUtils.h"
G_DEFINE_TYPE (NMSecretAgent, nm_secret_agent, G_TYPE_OBJECT)
@@ -296,7 +296,7 @@ nm_secret_agent_get_secrets (NMSecretAgent *self,
g_return_val_if_fail (priv->proxy != NULL, NULL);
dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_ALL);
- hash = _nm_utils_connection_dict_to_hash (dict);
+ hash = nm_utils_connection_dict_to_hash (dict);
g_variant_unref (dict);
/* Mask off the private ONLY_SYSTEM flag if present */
@@ -395,7 +395,7 @@ agent_new_save_delete (NMSecretAgent *self,
const char *cpath = nm_connection_get_path (connection);
dict = nm_connection_to_dbus (connection, flags);
- hash = _nm_utils_connection_dict_to_hash (dict);
+ hash = nm_utils_connection_dict_to_hash (dict);
g_variant_unref (dict);
r = request_new (self, cpath, NULL, callback, callback_data);
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 2f0bb8447b..db382adb82 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -29,7 +29,6 @@
#include <nm-setting-vpn.h>
#include <nm-setting-wireless.h>
#include <nm-utils.h>
-#include "nm-core-internal.h"
#include "nm-settings-connection.h"
#include "nm-session-monitor.h"
@@ -818,7 +817,7 @@ agent_secrets_done_cb (NMAgentManager *manager,
* will have been authenticated, so those secrets can replace the existing
* system secrets.
*/
- secrets_dict = _nm_utils_connection_hash_to_dict (secrets);
+ secrets_dict = nm_utils_connection_hash_to_dict (secrets);
if (nm_connection_update_secrets (NM_CONNECTION (self), setting_name, secrets_dict, &local)) {
/* Now that all secrets are updated, copy and cache new secrets,
* then save them to backing storage.
@@ -919,7 +918,7 @@ nm_settings_connection_get_secrets (NMSettingsConnection *self,
}
existing_secrets = nm_connection_to_dbus (priv->system_secrets, NM_CONNECTION_SERIALIZE_ONLY_SECRETS);
- existing_secrets_hash = _nm_utils_connection_dict_to_hash (existing_secrets);
+ existing_secrets_hash = nm_utils_connection_dict_to_hash (existing_secrets);
call_id = nm_agent_manager_get_secrets (priv->agent_mgr,
NM_CONNECTION (self),
subject,
@@ -1178,7 +1177,7 @@ get_settings_auth_cb (NMSettingsConnection *self,
*/
settings = nm_connection_to_dbus (NM_CONNECTION (dupl_con), NM_CONNECTION_SERIALIZE_NO_SECRETS);
g_assert (settings);
- settings_hash = _nm_utils_connection_dict_to_hash (settings);
+ settings_hash = nm_utils_connection_dict_to_hash (settings);
dbus_g_method_return (context, settings_hash);
g_hash_table_destroy (settings_hash);
g_variant_unref (settings);
@@ -1340,7 +1339,7 @@ impl_settings_connection_update_helper (NMSettingsConnection *self,
/* Check if the settings are valid first */
if (new_settings) {
- GVariant *new_settings_dict = _nm_utils_connection_hash_to_dict (new_settings);
+ GVariant *new_settings_dict = nm_utils_connection_hash_to_dict (new_settings);
tmp = nm_simple_connection_new_from_dbus (new_settings_dict, &error);
g_variant_unref (new_settings_dict);
@@ -1513,7 +1512,7 @@ dbus_get_agent_secrets_cb (NMSettingsConnection *self,
*/
dict = nm_connection_to_dbus (NM_CONNECTION (self), NM_CONNECTION_SERIALIZE_ONLY_SECRETS);
if (dict)
- hash = _nm_utils_connection_dict_to_hash (dict);
+ hash = nm_utils_connection_dict_to_hash (dict);
else
hash = g_hash_table_new (NULL, NULL);
dbus_g_method_return (context, hash);
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index cd163d2c2b..a4339ed492 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -1224,7 +1224,7 @@ impl_settings_add_connection_helper (NMSettings *self,
GVariant *dict;
GError *error = NULL;
- dict = _nm_utils_connection_hash_to_dict (settings);
+ dict = nm_utils_connection_hash_to_dict (settings);
connection = nm_simple_connection_new_from_dbus (dict, &error);
g_variant_unref (dict);
if (connection) {
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index b43fb2e222..50539d3604 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -40,7 +40,6 @@
#include "nm-platform.h"
#include "nm-logging.h"
#include "nm-utils.h"
-#include "nm-utils-private.h"
#include "nm-active-connection.h"
#include "nm-dbus-glib-types.h"
#include "NetworkManagerUtils.h"
@@ -1469,7 +1468,7 @@ _hash_with_username (NMConnection *connection, const char *username)
existing = nm_setting_vpn_get_user_name (s_vpn);
if (username == NULL || existing) {
dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_ALL);
- hash = _nm_utils_connection_dict_to_hash (dict);
+ hash = nm_utils_connection_dict_to_hash (dict);
g_variant_unref (dict);
return hash;
}
@@ -1482,7 +1481,7 @@ _hash_with_username (NMConnection *connection, const char *username)
dict = nm_connection_to_dbus (dup, NM_CONNECTION_SERIALIZE_ALL);
g_object_unref (dup);
- hash = _nm_utils_connection_dict_to_hash (dict);
+ hash = nm_utils_connection_dict_to_hash (dict);
g_variant_unref (dict);
return hash;
}