It will be up to the wifi plugin to decide when to stop such process.
---
gsupplicant/gsupplicant.h | 6 +++
gsupplicant/supplicant.c | 107 +++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 106 insertions(+), 7 deletions(-)
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index d0775c3..4881396 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -189,6 +189,12 @@ int g_supplicant_interface_autoscan(GSupplicantInterface
*interface,
GSupplicantInterfaceCallback callback,
void *user_data);
+int g_supplicant_interface_p2p_find(GSupplicantInterface *interface,
+ GSupplicantInterfaceCallback callback,
+ void *user_data);
+
+int g_supplicant_interface_p2p_stop_find(GSupplicantInterface *interface);
+
int g_supplicant_interface_connect(GSupplicantInterface *interface,
GSupplicantSSID *ssid,
GSupplicantInterfaceCallback callback,
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index b43defb..8f19345 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -155,6 +155,7 @@ struct _GSupplicantInterface {
unsigned int max_scan_ssids;
bool p2p_checked;
bool p2p_support;
+ bool p2p_finding;
dbus_bool_t ready;
GSupplicantState state;
dbus_bool_t scanning;
@@ -2959,14 +2960,8 @@ static void interface_scan_params(DBusMessageIter *iter,
void *user_data)
supplicant_dbus_dict_close(iter, &dict);
}
-int g_supplicant_interface_scan(GSupplicantInterface *interface,
- GSupplicantScanParams *scan_data,
- GSupplicantInterfaceCallback callback,
- void *user_data)
+static int interface_ready_to_scan(GSupplicantInterface *interface)
{
- struct interface_scan_data *data;
- int ret;
-
if (!interface)
return -EINVAL;
@@ -2992,6 +2987,21 @@ int g_supplicant_interface_scan(GSupplicantInterface
*interface,
break;
}
+ return 0;
+}
+
+int g_supplicant_interface_scan(GSupplicantInterface *interface,
+ GSupplicantScanParams *scan_data,
+ GSupplicantInterfaceCallback callback,
+ void *user_data)
+{
+ struct interface_scan_data *data;
+ int ret;
+
+ ret = interface_ready_to_scan(interface);
+ if (ret)
+ return ret;
+
data = dbus_malloc0(sizeof(*data));
if (!data)
return -ENOMEM;
@@ -3860,6 +3870,89 @@ int
g_supplicant_interface_disconnect(GSupplicantInterface *interface,
return ret;
}
+static void interface_p2p_find_result(const char *error,
+ DBusMessageIter *iter, void *user_data)
+{
+ struct interface_scan_data *data = user_data;
+ int err = 0;
+
+ SUPPLICANT_DBG("error %s", error);
+
+ if (error)
+ err = -EIO;
+
+ if (interface_exists(data->interface, data->path)) {
+ if (!data->interface->ready)
+ err = -ENOLINK;
+ if (!err)
+ data->interface->p2p_finding = true;
+ data->interface->pending_call = NULL;
+ }
+
+ if (data->callback)
+ data->callback(err, data->interface, data->user_data);
+
+ g_free(data->path);
+ dbus_free(data);
+}
+
+static void interface_p2p_find_params(DBusMessageIter *iter, void *user_data)
+{
+ DBusMessageIter dict;
+
+ supplicant_dbus_dict_open(iter, &dict);
+ supplicant_dbus_dict_close(iter, &dict);
+}
+
+int g_supplicant_interface_p2p_find(GSupplicantInterface *interface,
+ GSupplicantInterfaceCallback callback,
+ void *user_data)
+{
+ struct interface_scan_data *data;
+ int ret;
+
+ if (!interface->p2p_support)
+ return -ENOTSUP;
+
+ ret = interface_ready_to_scan(interface);
+ if (ret)
+ return ret;
+
+ data = dbus_malloc0(sizeof(*data));
+ if (!data)
+ return -ENOMEM;
+
+ data->interface = interface;
+ data->path = g_strdup(interface->path);
+ data->callback = callback;
+ data->user_data = user_data;
+
+ ret = supplicant_dbus_method_call(interface->path,
+ SUPPLICANT_INTERFACE ".Interface.P2PDevice", "Find",
+ interface_p2p_find_params, interface_p2p_find_result,
+ data, &interface->pending_call,
+ &interface->pending_slot);
+ if (ret < 0) {
+ g_free(data->path);
+ dbus_free(data);
+ }
+
+ return ret;
+}
+
+int g_supplicant_interface_p2p_stop_find(GSupplicantInterface *interface)
+{
+ if (!interface->p2p_finding)
+ return 0;
+
+ SUPPLICANT_DBG("");
+
+ interface->p2p_finding = false;
+
+ return supplicant_dbus_method_call(interface->path,
+ SUPPLICANT_INTERFACE ".Interface.P2PDevice", "StopFind",
+ NULL, NULL, NULL, NULL, NULL);
+}
static const char *g_supplicant_rule0 = "type=signal,"
"path=" DBUS_PATH_DBUS ","
--
1.8.3.2
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman