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

Reply via email to