supplicant: convert blob handling to new supplicant interface
This commit is contained in:
@@ -91,6 +91,7 @@ typedef struct {
|
|||||||
DBusGProxy * iface_proxy;
|
DBusGProxy * iface_proxy;
|
||||||
DBusGProxy * props_proxy;
|
DBusGProxy * props_proxy;
|
||||||
char * net_path;
|
char * net_path;
|
||||||
|
guint32 blobs_left;
|
||||||
|
|
||||||
guint32 last_scan;
|
guint32 last_scan;
|
||||||
|
|
||||||
@@ -246,7 +247,6 @@ wpas_iface_bss_added (DBusGProxy *proxy,
|
|||||||
GHashTable *props,
|
GHashTable *props,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
g_message ("%s: here op %s props %p", __func__, object_path, props);
|
|
||||||
g_signal_emit (NM_SUPPLICANT_INTERFACE (user_data), signals[NEW_BSS], 0, props);
|
g_signal_emit (NM_SUPPLICANT_INTERFACE (user_data), signals[NEW_BSS], 0, props);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -714,6 +714,10 @@ call_select_network (NMSupplicantInterface *self)
|
|||||||
DBusGProxyCall *call;
|
DBusGProxyCall *call;
|
||||||
NMSupplicantInfo *info;
|
NMSupplicantInfo *info;
|
||||||
|
|
||||||
|
/* We only select the network after all blobs (if any) have been set */
|
||||||
|
if (priv->blobs_left > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
info = nm_supplicant_info_new (self, priv->iface_proxy, priv->assoc_pcalls);
|
info = nm_supplicant_info_new (self, priv->iface_proxy, priv->assoc_pcalls);
|
||||||
call = dbus_g_proxy_begin_call (priv->iface_proxy, "SelectNetwork",
|
call = dbus_g_proxy_begin_call (priv->iface_proxy, "SelectNetwork",
|
||||||
select_network_cb,
|
select_network_cb,
|
||||||
@@ -725,12 +729,15 @@ call_select_network (NMSupplicantInterface *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_blobs_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
add_blob_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
||||||
{
|
{
|
||||||
NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
|
NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
|
||||||
|
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
guint tmp;
|
guint tmp;
|
||||||
|
|
||||||
|
priv->blobs_left--;
|
||||||
|
|
||||||
if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_UINT, &tmp, G_TYPE_INVALID)) {
|
if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_UINT, &tmp, G_TYPE_INVALID)) {
|
||||||
nm_log_warn (LOGD_SUPPLICANT, "Couldn't set network certificates: %s.", err->message);
|
nm_log_warn (LOGD_SUPPLICANT, "Couldn't set network certificates: %s.", err->message);
|
||||||
emit_error_helper (info->interface, err);
|
emit_error_helper (info->interface, err);
|
||||||
@@ -739,66 +746,6 @@ set_blobs_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
|||||||
call_select_network (info->interface);
|
call_select_network (info->interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GValue *
|
|
||||||
byte_array_to_gvalue (const GByteArray *array)
|
|
||||||
{
|
|
||||||
GValue *val;
|
|
||||||
|
|
||||||
val = g_slice_new0 (GValue);
|
|
||||||
g_value_init (val, DBUS_TYPE_G_UCHAR_ARRAY);
|
|
||||||
g_value_set_boxed (val, array);
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
blob_free (GValue *val)
|
|
||||||
{
|
|
||||||
g_value_unset (val);
|
|
||||||
g_slice_free (GValue, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
convert_blob (const char *key, const GByteArray *value, GHashTable *hash)
|
|
||||||
{
|
|
||||||
GValue *val;
|
|
||||||
|
|
||||||
val = byte_array_to_gvalue (value);
|
|
||||||
g_hash_table_insert (hash, g_strdup (key), val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
call_set_blobs (NMSupplicantInterface *self, GHashTable *orig_blobs)
|
|
||||||
{
|
|
||||||
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
|
|
||||||
DBusGProxyCall *call;
|
|
||||||
GHashTable *blobs;
|
|
||||||
NMSupplicantInfo *info;
|
|
||||||
|
|
||||||
blobs = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
||||||
(GDestroyNotify) g_free,
|
|
||||||
(GDestroyNotify) blob_free);
|
|
||||||
if (!blobs) {
|
|
||||||
const char *msg = "Not enough memory to create blob table.";
|
|
||||||
|
|
||||||
nm_log_warn (LOGD_SUPPLICANT, "%s", msg);
|
|
||||||
g_signal_emit (self, signals[CONNECTION_ERROR], 0, "SendBlobError", msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hash_table_foreach (orig_blobs, (GHFunc) convert_blob, blobs);
|
|
||||||
|
|
||||||
info = nm_supplicant_info_new (self, priv->iface_proxy, priv->assoc_pcalls);
|
|
||||||
call = dbus_g_proxy_begin_call (priv->iface_proxy, "setBlobs",
|
|
||||||
set_blobs_cb,
|
|
||||||
info,
|
|
||||||
nm_supplicant_info_destroy,
|
|
||||||
DBUS_TYPE_G_MAP_OF_VARIANT, blobs,
|
|
||||||
G_TYPE_INVALID);
|
|
||||||
nm_supplicant_info_set_call (info, call);
|
|
||||||
g_hash_table_destroy (blobs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
||||||
{
|
{
|
||||||
@@ -806,6 +753,10 @@ add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
|||||||
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
|
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
GHashTable *blobs;
|
GHashTable *blobs;
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer name, data;
|
||||||
|
DBusGProxyCall *call;
|
||||||
|
NMSupplicantInfo *blob_info;
|
||||||
|
|
||||||
g_free (priv->net_path);
|
g_free (priv->net_path);
|
||||||
priv->net_path = NULL;
|
priv->net_path = NULL;
|
||||||
@@ -822,10 +773,21 @@ add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
|
|||||||
|
|
||||||
/* Send blobs first; otherwise jump to sending the config settings */
|
/* Send blobs first; otherwise jump to sending the config settings */
|
||||||
blobs = nm_supplicant_config_get_blobs (priv->cfg);
|
blobs = nm_supplicant_config_get_blobs (priv->cfg);
|
||||||
if (g_hash_table_size (blobs) > 0)
|
priv->blobs_left = g_hash_table_size (blobs);
|
||||||
call_set_blobs (info->interface, blobs);
|
g_hash_table_iter_init (&iter, blobs);
|
||||||
else
|
while (g_hash_table_iter_next (&iter, &name, &data)) {
|
||||||
call_select_network (info->interface);
|
blob_info = nm_supplicant_info_new (info->interface, priv->iface_proxy, priv->assoc_pcalls);
|
||||||
|
call = dbus_g_proxy_begin_call (priv->iface_proxy, "AddBlob",
|
||||||
|
add_blob_cb,
|
||||||
|
blob_info,
|
||||||
|
nm_supplicant_info_destroy,
|
||||||
|
DBUS_TYPE_STRING, name,
|
||||||
|
DBUS_TYPE_G_UCHAR_ARRAY, blobs,
|
||||||
|
G_TYPE_INVALID);
|
||||||
|
nm_supplicant_info_set_call (blob_info, call);
|
||||||
|
}
|
||||||
|
|
||||||
|
call_select_network (info->interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user