Same structure will be then used to check whether or not the IEs property has changed as well. --- gsupplicant/supplicant.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-)
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index e96d80b..4122182 100644 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -231,7 +231,6 @@ struct _GSupplicantPeer { char *identifier; unsigned int wps_capabilities; GSList *groups; - bool groups_changed; const GSupplicantInterface *current_group_iface; }; @@ -2541,14 +2540,15 @@ static void create_peer_identifier(GSupplicantPeer *peer) peer->device_address[5]); } -struct peer_group_data { +struct peer_property_data { GSupplicantPeer *peer; GSList *old_groups; + bool groups_changed; }; static void peer_groups_relation(DBusMessageIter *iter, void *user_data) { - struct peer_group_data *data = user_data; + struct peer_property_data *data = user_data; GSupplicantPeer *peer = data->peer; GSupplicantGroup *group; const char *str = NULL; @@ -2568,14 +2568,15 @@ static void peer_groups_relation(DBusMessageIter *iter, void *user_data) peer->groups = g_slist_concat(elem, peer->groups); } else { peer->groups = g_slist_prepend(peer->groups, g_strdup(str)); - peer->groups_changed = true; + data->groups_changed = true; } } static void peer_property(const char *key, DBusMessageIter *iter, void *user_data) { - GSupplicantPeer *peer = user_data; + struct peer_property_data *data = user_data; + GSupplicantPeer *peer = data->peer; SUPPLICANT_DBG("key: %s", key); @@ -2588,6 +2589,8 @@ static void peer_property(const char *key, DBusMessageIter *iter, callback_peer_found(peer); } + dbus_free(data); + return; } @@ -2617,23 +2620,21 @@ static void peer_property(const char *key, DBusMessageIter *iter, if (wps_config & ~G_SUPPLICANT_WPS_CONFIG_PBC) peer->wps_capabilities |= G_SUPPLICANT_WPS_PIN; } else if (g_strcmp0(key, "Groups") == 0) { - struct peer_group_data data = { - .peer = peer, - .old_groups = peer->groups, - }; + data->old_groups = peer->groups; peer->groups = NULL; supplicant_dbus_array_foreach(iter, - peer_groups_relation, &data); - if (g_slist_length(data.old_groups) > 0) { - g_slist_free_full(data.old_groups, g_free); - peer->groups_changed = true; + peer_groups_relation, data); + if (g_slist_length(data->old_groups) > 0) { + g_slist_free_full(data->old_groups, g_free); + data->groups_changed = true; } } } static void signal_peer_found(const char *path, DBusMessageIter *iter) { + struct peer_property_data *property_data; GSupplicantInterface *interface; const char *obj_path = NULL; GSupplicantPeer *peer; @@ -2661,16 +2662,20 @@ static void signal_peer_found(const char *path, DBusMessageIter *iter) g_hash_table_insert(interface->peer_table, peer->path, peer); g_hash_table_replace(peer_mapping, peer->path, interface); + property_data = dbus_malloc0(sizeof(struct peer_property_data)); + property_data->peer = peer; + dbus_message_iter_next(iter); if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) { - supplicant_dbus_property_foreach(iter, peer_property, peer); - peer_property(NULL, NULL, peer); + supplicant_dbus_property_foreach(iter, peer_property, + property_data); + peer_property(NULL, NULL, property_data); return; } supplicant_dbus_property_get_all(obj_path, SUPPLICANT_INTERFACE ".Peer", - peer_property, peer, NULL); + peer_property, property_data, NULL); } static void signal_peer_lost(const char *path, DBusMessageIter *iter) @@ -2698,6 +2703,7 @@ static void signal_peer_lost(const char *path, DBusMessageIter *iter) static void signal_peer_changed(const char *path, DBusMessageIter *iter) { + struct peer_property_data *property_data; GSupplicantInterface *interface; GSupplicantPeer *peer; @@ -2713,13 +2719,16 @@ static void signal_peer_changed(const char *path, DBusMessageIter *iter) return; } - supplicant_dbus_property_foreach(iter, peer_property, peer); - if (!peer->groups_changed) + property_data = dbus_malloc0(sizeof(struct peer_property_data)); + property_data->peer = peer; + + supplicant_dbus_property_foreach(iter, peer_property, property_data); + if (!property_data->groups_changed) return; callback_peer_changed(peer, G_SUPPLICANT_PEER_GROUP_CHANGED); - peer->groups_changed = false; + dbus_free(property_data); } struct group_sig_data { -- 1.8.5.5 _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman