summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/devices/nm-device.c38
-rw-r--r--src/nm-dhcp4-config.c77
-rw-r--r--src/nm-dhcp4-config.h9
-rw-r--r--src/nm-dhcp6-config.c77
-rw-r--r--src/nm-dhcp6-config.h9
-rw-r--r--src/nm-dispatcher.c66
6 files changed, 94 insertions, 182 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 853ad638b3..271201444f 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -3418,22 +3418,6 @@ dhcp4_fail (NMDevice *self, gboolean timeout)
}
static void
-dhcp4_update_config (NMDevice *self, NMDhcp4Config *config, GHashTable *options)
-{
- GHashTableIter iter;
- const char *key, *value;
-
- /* Update the DHCP4 config object with new DHCP options */
- nm_dhcp4_config_reset (config);
-
- g_hash_table_iter_init (&iter, options);
- while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value))
- nm_dhcp4_config_add_option (config, key, value);
-
- g_object_notify (G_OBJECT (self), NM_DEVICE_DHCP4_CONFIG);
-}
-
-static void
dhcp4_state_changed (NMDhcpClient *client,
NMDhcpState state,
NMIP4Config *ip4_config,
@@ -3458,7 +3442,8 @@ dhcp4_state_changed (NMDhcpClient *client,
break;
}
- dhcp4_update_config (self, priv->dhcp4_config, options);
+ nm_dhcp4_config_set_options (priv->dhcp4_config, options);
+ g_object_notify (G_OBJECT (self), NM_DEVICE_DHCP4_CONFIG);
if (priv->ip4_state == IP_CONF)
nm_device_activate_schedule_ip4_config_result (self, ip4_config);
@@ -4074,22 +4059,6 @@ dhcp6_timeout (NMDevice *self, NMDhcpClient *client)
}
static void
-dhcp6_update_config (NMDevice *self, NMDhcp6Config *config, GHashTable *options)
-{
- GHashTableIter iter;
- const char *key, *value;
-
- /* Update the DHCP6 config object with new DHCP options */
- nm_dhcp6_config_reset (config);
-
- g_hash_table_iter_init (&iter, options);
- while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value))
- nm_dhcp6_config_add_option (config, key, value);
-
- g_object_notify (G_OBJECT (self), NM_DEVICE_DHCP6_CONFIG);
-}
-
-static void
dhcp6_state_changed (NMDhcpClient *client,
NMDhcpState state,
NMIP6Config *ip6_config,
@@ -4109,7 +4078,8 @@ dhcp6_state_changed (NMDhcpClient *client,
g_clear_object (&priv->dhcp6_ip6_config);
if (ip6_config) {
priv->dhcp6_ip6_config = g_object_ref (ip6_config);
- dhcp6_update_config (self, priv->dhcp6_config, options);
+ nm_dhcp6_config_set_options (priv->dhcp6_config, options);
+ g_object_notify (G_OBJECT (self), NM_DEVICE_DHCP6_CONFIG);
}
if (priv->ip6_state == IP_CONF) {
diff --git a/src/nm-dhcp4-config.c b/src/nm-dhcp4-config.c
index bc495589fe..d2d93d31fd 100644
--- a/src/nm-dhcp4-config.c
+++ b/src/nm-dhcp4-config.c
@@ -34,7 +34,7 @@ G_DEFINE_TYPE (NMDhcp4Config, nm_dhcp4_config, NM_TYPE_EXPORTED_OBJECT)
#define NM_DHCP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP4_CONFIG, NMDhcp4ConfigPrivate))
typedef struct {
- GHashTable *options;
+ GVariant *options;
} NMDhcp4ConfigPrivate;
@@ -53,68 +53,50 @@ nm_dhcp4_config_new (void)
}
void
-nm_dhcp4_config_add_option (NMDhcp4Config *self,
- const char *key,
- const char *option)
+nm_dhcp4_config_set_options (NMDhcp4Config *self,
+ GHashTable *options)
{
- GValue *svalue;
+ NMDhcp4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (self);
+ GHashTableIter iter;
+ const char *key, *value;
+ GVariantBuilder builder;
g_return_if_fail (NM_IS_DHCP4_CONFIG (self));
- g_return_if_fail (key != NULL);
- g_return_if_fail (option != NULL);
+ g_return_if_fail (options != NULL);
- svalue = g_slice_new0 (GValue);
- g_value_init (svalue, G_TYPE_STRING);
- g_value_set_string (svalue, option);
- g_hash_table_insert (NM_DHCP4_CONFIG_GET_PRIVATE (self)->options, g_strdup (key), svalue);
- g_object_notify (G_OBJECT (self), NM_DHCP4_CONFIG_OPTIONS);
-}
+ g_variant_unref (priv->options);
-void
-nm_dhcp4_config_reset (NMDhcp4Config *self)
-{
- g_return_if_fail (NM_IS_DHCP4_CONFIG (self));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_hash_table_iter_init (&iter, options);
+ while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value))
+ g_variant_builder_add (&builder, "{sv}", key, g_variant_new_string (value));
- g_hash_table_remove_all (NM_DHCP4_CONFIG_GET_PRIVATE (self)->options);
+ priv->options = g_variant_builder_end (&builder);
+ g_variant_ref_sink (priv->options);
g_object_notify (G_OBJECT (self), NM_DHCP4_CONFIG_OPTIONS);
}
const char *
nm_dhcp4_config_get_option (NMDhcp4Config *self, const char *key)
{
- GValue *value;
+ NMDhcp4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (self);
+ const char *value;
g_return_val_if_fail (NM_IS_DHCP4_CONFIG (self), NULL);
g_return_val_if_fail (key != NULL, NULL);
- value = g_hash_table_lookup (NM_DHCP4_CONFIG_GET_PRIVATE (self)->options, key);
- return value ? g_value_get_string (value) : NULL;
+ if (g_variant_lookup (priv->options, key, "&s", &value))
+ return value;
+ else
+ return NULL;
}
-/* Caller owns the list, but not the values in the list */
-GSList *
-nm_dhcp4_config_list_options (NMDhcp4Config *self)
+GVariant *
+nm_dhcp4_config_get_options (NMDhcp4Config *self)
{
- GHashTableIter iter;
- const char *option = NULL;
- GSList *list = NULL;
-
g_return_val_if_fail (NM_IS_DHCP4_CONFIG (self), NULL);
- g_hash_table_iter_init (&iter, NM_DHCP4_CONFIG_GET_PRIVATE (self)->options);
- while (g_hash_table_iter_next (&iter, (gpointer) &option, NULL))
- list = g_slist_prepend (list, (gpointer) option);
-
- return list;
-}
-
-static void
-nm_gvalue_destroy (gpointer data)
-{
- GValue *value = (GValue *) data;
-
- g_value_unset (value);
- g_slice_free (GValue, value);
+ return g_variant_ref (NM_DHCP4_CONFIG_GET_PRIVATE (self)->options);
}
static void
@@ -124,7 +106,8 @@ nm_dhcp4_config_init (NMDhcp4Config *self)
nm_exported_object_export (NM_EXPORTED_OBJECT (self));
- priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
+ priv->options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
+ g_variant_ref_sink (priv->options);
}
static void
@@ -132,7 +115,7 @@ finalize (GObject *object)
{
NMDhcp4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object);
- g_hash_table_destroy (priv->options);
+ g_variant_unref (priv->options);
G_OBJECT_CLASS (nm_dhcp4_config_parent_class)->finalize (object);
}
@@ -145,7 +128,11 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_OPTIONS:
- g_value_set_boxed (value, priv->options);
+ /* dbus_g_value_parse_g_variant() will call g_value_init(), but
+ * @value is already inited.
+ */
+ g_value_unset (value);
+ dbus_g_value_parse_g_variant (priv->options, value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/src/nm-dhcp4-config.h b/src/nm-dhcp4-config.h
index 8dabecc8c2..080e28deff 100644
--- a/src/nm-dhcp4-config.h
+++ b/src/nm-dhcp4-config.h
@@ -45,14 +45,11 @@ GType nm_dhcp4_config_get_type (void);
NMDhcp4Config *nm_dhcp4_config_new (void);
-void nm_dhcp4_config_add_option (NMDhcp4Config *config,
- const char *key,
- const char *option);
-
-void nm_dhcp4_config_reset (NMDhcp4Config *config);
+void nm_dhcp4_config_set_options (NMDhcp4Config *config,
+ GHashTable *options);
const char *nm_dhcp4_config_get_option (NMDhcp4Config *config, const char *option);
-GSList *nm_dhcp4_config_list_options (NMDhcp4Config *config);
+GVariant *nm_dhcp4_config_get_options (NMDhcp4Config *config);
#endif /* __NETWORKMANAGER_DHCP4_CONFIG_H__ */
diff --git a/src/nm-dhcp6-config.c b/src/nm-dhcp6-config.c
index 1d3168f28e..6b27c532bd 100644
--- a/src/nm-dhcp6-config.c
+++ b/src/nm-dhcp6-config.c
@@ -34,7 +34,7 @@ G_DEFINE_TYPE (NMDhcp6Config, nm_dhcp6_config, NM_TYPE_EXPORTED_OBJECT)
#define NM_DHCP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP6_CONFIG, NMDhcp6ConfigPrivate))
typedef struct {
- GHashTable *options;
+ GVariant *options;
} NMDhcp6ConfigPrivate;
@@ -53,68 +53,50 @@ nm_dhcp6_config_new (void)
}
void
-nm_dhcp6_config_add_option (NMDhcp6Config *self,
- const char *key,
- const char *option)
+nm_dhcp6_config_set_options (NMDhcp6Config *self,
+ GHashTable *options)
{
- GValue *svalue;
+ NMDhcp6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (self);
+ GHashTableIter iter;
+ const char *key, *value;
+ GVariantBuilder builder;
g_return_if_fail (NM_IS_DHCP6_CONFIG (self));
- g_return_if_fail (key != NULL);
- g_return_if_fail (option != NULL);
+ g_return_if_fail (options != NULL);
- svalue = g_slice_new0 (GValue);
- g_value_init (svalue, G_TYPE_STRING);
- g_value_set_string (svalue, option);
- g_hash_table_insert (NM_DHCP6_CONFIG_GET_PRIVATE (self)->options, g_strdup (key), svalue);
- g_object_notify (G_OBJECT (self), NM_DHCP6_CONFIG_OPTIONS);
-}
+ g_variant_unref (priv->options);
-void
-nm_dhcp6_config_reset (NMDhcp6Config *self)
-{
- g_return_if_fail (NM_IS_DHCP6_CONFIG (self));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_hash_table_iter_init (&iter, options);
+ while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value))
+ g_variant_builder_add (&builder, "{sv}", key, g_variant_new_string (value));
- g_hash_table_remove_all (NM_DHCP6_CONFIG_GET_PRIVATE (self)->options);
+ priv->options = g_variant_builder_end (&builder);
+ g_variant_ref_sink (priv->options);
g_object_notify (G_OBJECT (self), NM_DHCP6_CONFIG_OPTIONS);
}
const char *
nm_dhcp6_config_get_option (NMDhcp6Config *self, const char *key)
{
- GValue *value;
+ NMDhcp6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (self);
+ const char *value;
g_return_val_if_fail (NM_IS_DHCP6_CONFIG (self), NULL);
g_return_val_if_fail (key != NULL, NULL);
- value = g_hash_table_lookup (NM_DHCP6_CONFIG_GET_PRIVATE (self)->options, key);
- return value ? g_value_get_string (value) : NULL;
+ if (g_variant_lookup (priv->options, key, "&s", &value))
+ return value;
+ else
+ return NULL;
}
-/* Caller owns the list, but not the values in the list */
-GSList *
-nm_dhcp6_config_list_options (NMDhcp6Config *self)
+GVariant *
+nm_dhcp6_config_get_options (NMDhcp6Config *self)
{
- GHashTableIter iter;
- const char *option = NULL;
- GSList *list = NULL;
-
g_return_val_if_fail (NM_IS_DHCP6_CONFIG (self), NULL);
- g_hash_table_iter_init (&iter, NM_DHCP6_CONFIG_GET_PRIVATE (self)->options);
- while (g_hash_table_iter_next (&iter, (gpointer) &option, NULL))
- list = g_slist_prepend (list, (gpointer) option);
-
- return list;
-}
-
-static void
-nm_gvalue_destroy (gpointer data)
-{
- GValue *value = (GValue *) data;
-
- g_value_unset (value);
- g_slice_free (GValue, value);
+ return g_variant_ref (NM_DHCP6_CONFIG_GET_PRIVATE (self)->options);
}
static void
@@ -124,7 +106,8 @@ nm_dhcp6_config_init (NMDhcp6Config *self)
nm_exported_object_export (NM_EXPORTED_OBJECT (self));
- priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
+ priv->options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
+ g_variant_ref_sink (priv->options);
}
static void
@@ -132,7 +115,7 @@ finalize (GObject *object)
{
NMDhcp6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (object);
- g_hash_table_destroy (priv->options);
+ g_variant_unref (priv->options);
G_OBJECT_CLASS (nm_dhcp6_config_parent_class)->finalize (object);
}
@@ -145,7 +128,11 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_OPTIONS:
- g_value_set_boxed (value, priv->options);
+ /* dbus_g_value_parse_g_variant() will call g_value_init(), but
+ * @value is already inited.
+ */
+ g_value_unset (value);
+ dbus_g_value_parse_g_variant (priv->options, value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/src/nm-dhcp6-config.h b/src/nm-dhcp6-config.h
index f0b79cc6fc..c018d97f0c 100644
--- a/src/nm-dhcp6-config.h
+++ b/src/nm-dhcp6-config.h
@@ -45,14 +45,11 @@ GType nm_dhcp6_config_get_type (void);
NMDhcp6Config *nm_dhcp6_config_new (void);
-void nm_dhcp6_config_add_option (NMDhcp6Config *config,
- const char *key,
- const char *option);
-
-void nm_dhcp6_config_reset (NMDhcp6Config *config);
+void nm_dhcp6_config_set_options (NMDhcp6Config *config,
+ GHashTable *options);
const char *nm_dhcp6_config_get_option (NMDhcp6Config *config, const char *option);
-GSList *nm_dhcp6_config_list_options (NMDhcp6Config *self);
+GVariant *nm_dhcp6_config_get_options (NMDhcp6Config *self);
#endif /* __NETWORKMANAGER_DHCP6_CONFIG_H__ */
diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c
index c64c991188..cba3b5cad6 100644
--- a/src/nm-dispatcher.c
+++ b/src/nm-dispatcher.c
@@ -221,44 +221,12 @@ dump_ip6_to_props (NMIP6Config *ip6, GVariantBuilder *builder)
}
static void
-dump_dhcp4_to_props (NMDhcp4Config *config, GVariantBuilder *builder)
-{
- GSList *options, *iter;
-
- options = nm_dhcp4_config_list_options (config);
- for (iter = options; iter; iter = g_slist_next (iter)) {
- const char *option = (const char *) iter->data;
- const char *val;
-
- val = nm_dhcp4_config_get_option (config, option);
- g_variant_builder_add (builder, "{sv}", option, g_variant_new_string (val));
- }
- g_slist_free (options);
-}
-
-static void
-dump_dhcp6_to_props (NMDhcp6Config *config, GVariantBuilder *builder)
-{
- GSList *options, *iter;
-
- options = nm_dhcp6_config_list_options (config);
- for (iter = options; iter; iter = g_slist_next (iter)) {
- const char *option = (const char *) iter->data;
- const char *val;
-
- val = nm_dhcp6_config_get_option (config, option);
- g_variant_builder_add (builder, "{sv}", option, g_variant_new_string (val));
- }
- g_slist_free (options);
-}
-
-static void
fill_device_props (NMDevice *device,
GVariantBuilder *dev_builder,
GVariantBuilder *ip4_builder,
GVariantBuilder *ip6_builder,
- GVariantBuilder *dhcp4_builder,
- GVariantBuilder *dhcp6_builder)
+ GVariant **dhcp4_props,
+ GVariant **dhcp6_props)
{
NMIP4Config *ip4_config;
NMIP6Config *ip6_config;
@@ -287,11 +255,11 @@ fill_device_props (NMDevice *device,
dhcp4_config = nm_device_get_dhcp4_config (device);
if (dhcp4_config)
- dump_dhcp4_to_props (dhcp4_config, dhcp4_builder);
+ *dhcp4_props = nm_dhcp4_config_get_options (dhcp4_config);
dhcp6_config = nm_device_get_dhcp6_config (device);
if (dhcp6_config)
- dump_dhcp6_to_props (dhcp6_config, dhcp6_builder);
+ *dhcp6_props = nm_dhcp6_config_get_options (dhcp6_config);
}
static void
@@ -485,8 +453,8 @@ _dispatcher_call (DispatcherAction action,
GVariantBuilder device_props;
GVariantBuilder device_ip4_props;
GVariantBuilder device_ip6_props;
- GVariantBuilder device_dhcp4_props;
- GVariantBuilder device_dhcp6_props;
+ GVariant *device_dhcp4_props = NULL;
+ GVariant *device_dhcp6_props = NULL;
GVariantBuilder vpn_ip4_props;
GVariantBuilder vpn_ip6_props;
DispatchInfo *info = NULL;
@@ -572,8 +540,6 @@ _dispatcher_call (DispatcherAction action,
g_variant_builder_init (&device_props, G_VARIANT_TYPE_VARDICT);
g_variant_builder_init (&device_ip4_props, G_VARIANT_TYPE_VARDICT);
g_variant_builder_init (&device_ip6_props, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_init (&device_dhcp4_props, G_VARIANT_TYPE_VARDICT);
- g_variant_builder_init (&device_dhcp6_props, G_VARIANT_TYPE_VARDICT);
g_variant_builder_init (&vpn_ip4_props, G_VARIANT_TYPE_VARDICT);
g_variant_builder_init (&vpn_ip6_props, G_VARIANT_TYPE_VARDICT);
@@ -593,21 +559,26 @@ _dispatcher_call (DispatcherAction action,
}
}
+ if (!device_dhcp4_props)
+ device_dhcp4_props = g_variant_ref_sink (g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0));
+ if (!device_dhcp6_props)
+ device_dhcp6_props = g_variant_ref_sink (g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0));
+
/* Send the action to the dispatcher */
if (blocking) {
GVariant *ret;
GVariantIter *results;
ret = _nm_dbus_proxy_call_sync (dispatcher_proxy, "Action",
- g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}a{sv}a{sv}sa{sv}a{sv}b)",
+ g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}@a{sv}@a{sv}sa{sv}a{sv}b)",
action_to_string (action),
connection_dict,
&connection_props,
&device_props,
&device_ip4_props,
&device_ip6_props,
- &device_dhcp4_props,
- &device_dhcp6_props,
+ device_dhcp4_props,
+ device_dhcp6_props,
vpn_iface ? vpn_iface : "",
&vpn_ip4_props,
&vpn_ip6_props,
@@ -634,15 +605,15 @@ _dispatcher_call (DispatcherAction action,
info->callback = callback;
info->user_data = user_data;
g_dbus_proxy_call (dispatcher_proxy, "Action",
- g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}a{sv}a{sv}sa{sv}a{sv}b)",
+ g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}@a{sv}@a{sv}sa{sv}a{sv}b)",
action_to_string (action),
connection_dict,
&connection_props,
&device_props,
&device_ip4_props,
&device_ip6_props,
- &device_dhcp4_props,
- &device_dhcp6_props,
+ device_dhcp4_props,
+ device_dhcp6_props,
vpn_iface ? vpn_iface : "",
&vpn_ip4_props,
&vpn_ip6_props,
@@ -652,6 +623,9 @@ _dispatcher_call (DispatcherAction action,
success = TRUE;
}
+ g_variant_unref (device_dhcp4_props);
+ g_variant_unref (device_dhcp6_props);
+
done:
if (success && info) {
/* Track the request in case of cancelation */