]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Add a Groups property to a Peer object on which it belongs
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Mon, 2 Jun 2014 14:42:05 +0000 (17:42 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 29 Jun 2014 14:09:32 +0000 (17:09 +0300)
If only the Peer is part of one or more group, this property will tell
those via listing their object paths.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.h

index 6bd2a40c0c67d37ebbb64148850faccb3d29e2d6..71cf1c937b1d210f5d6260a089c56bf87d7f5d78 100644 (file)
@@ -3271,6 +3271,10 @@ static const struct wpa_dbus_property_desc wpas_dbus_p2p_peer_properties[] = {
          wpas_dbus_getter_p2p_peer_device_address,
          NULL
        },
+       { "Groups", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ao",
+         wpas_dbus_getter_p2p_peer_groups,
+         NULL
+       },
        { NULL, NULL, NULL, NULL, NULL }
 };
 
index 857b5275792851703054ab04663555a68b17e560..3fb5f4cf3ce94efb44fe9b58868a783ce9c74c9f 100644 (file)
@@ -1530,6 +1530,106 @@ dbus_bool_t wpas_dbus_getter_p2p_peer_device_address(DBusMessageIter *iter,
 }
 
 
+struct peer_group_data {
+       struct wpa_supplicant *wpa_s;
+       const struct p2p_peer_info *info;
+       char **paths;
+       unsigned int nb_paths;
+       int error;
+};
+
+
+static int match_group_where_peer_is_client(struct p2p_group *group,
+                                           void *user_data)
+{
+       struct peer_group_data *data = user_data;
+       const struct p2p_group_config *cfg;
+       struct wpa_supplicant *wpa_s_go;
+       char **paths;
+
+       if (!p2p_group_is_client_connected(group, data->info->p2p_device_addr))
+               return 1;
+
+       cfg = p2p_group_get_config(group);
+
+       wpa_s_go = wpas_get_p2p_go_iface(data->wpa_s, cfg->ssid,
+                                        cfg->ssid_len);
+       if (wpa_s_go == NULL)
+               return 1;
+
+       paths = os_realloc_array(data->paths, data->nb_paths + 1,
+                                sizeof(char *));
+       if (paths == NULL)
+               goto out_of_memory;
+
+       data->paths = paths;
+       data->paths[data->nb_paths] = wpa_s_go->dbus_groupobj_path;
+       data->nb_paths++;
+
+       return 1;
+
+out_of_memory:
+       data->error = ENOMEM;
+       return 0;
+}
+
+
+dbus_bool_t wpas_dbus_getter_p2p_peer_groups(DBusMessageIter *iter,
+                                            DBusError *error,
+                                            void *user_data)
+{
+       struct peer_handler_args *peer_args = user_data;
+       const struct p2p_peer_info *info;
+       struct peer_group_data data;
+       struct wpa_supplicant *wpa_s_go;
+       dbus_bool_t success = FALSE;
+
+       info = p2p_get_peer_found(peer_args->wpa_s->global->p2p,
+                                 peer_args->p2p_device_addr, 0);
+       if (info == NULL) {
+               dbus_set_error(error, DBUS_ERROR_FAILED,
+                              "failed to find peer");
+               return FALSE;
+       }
+
+       os_memset(&data, 0, sizeof(data));
+       wpa_s_go = wpas_get_p2p_client_iface(peer_args->wpa_s,
+                                            info->p2p_device_addr);
+       if (wpa_s_go) {
+               data.paths = os_calloc(1, sizeof(char *));
+               if (data.paths == NULL)
+                       goto out_of_memory;
+               data.paths[0] = wpa_s_go->dbus_groupobj_path;
+               data.nb_paths = 1;
+       }
+
+       data.wpa_s = peer_args->wpa_s;
+       data.info = info;
+
+       p2p_loop_on_all_groups(peer_args->wpa_s->global->p2p,
+                              match_group_where_peer_is_client, &data);
+       if (data.error)
+               goto out_of_memory;
+
+       if (data.paths == NULL) {
+               return wpas_dbus_simple_array_property_getter(
+                       iter, DBUS_TYPE_OBJECT_PATH, NULL, 0, error);
+       }
+
+       success = wpas_dbus_simple_array_property_getter(iter,
+                                                        DBUS_TYPE_OBJECT_PATH,
+                                                        data.paths,
+                                                        data.nb_paths, error);
+       goto out;
+
+out_of_memory:
+       dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+out:
+       os_free(data.paths);
+       return success;
+}
+
+
 /**
  * wpas_dbus_getter_persistent_groups - Get array of persistent group objects
  * @iter: Pointer to incoming dbus message iter
index 67e0e9dbb4d0822db60c1d2dfe5f197142fe2455..ea307a274a28f7d8fc233eefbbc8cc2aa071d41a 100644 (file)
@@ -151,6 +151,10 @@ dbus_bool_t wpas_dbus_getter_p2p_peer_device_address(DBusMessageIter *iter,
                                                     DBusError *error,
                                                     void *user_data);
 
+dbus_bool_t wpas_dbus_getter_p2p_peer_groups(DBusMessageIter *iter,
+                                            DBusError *error,
+                                            void *user_data);
+
 /*
  * P2P Group properties
  */