diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/NetworkManagerUtils.c | 145 | ||||
-rw-r--r-- | src/NetworkManagerUtils.h | 6 | ||||
-rw-r--r-- | src/nm-dispatcher.c | 3 | ||||
-rw-r--r-- | src/nm-manager.c | 3 | ||||
-rw-r--r-- | src/settings/nm-agent-manager.c | 6 | ||||
-rw-r--r-- | src/settings/nm-secret-agent.c | 6 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.c | 11 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 2 | ||||
-rw-r--r-- | src/vpn-manager/nm-vpn-connection.c | 5 |
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; } |