- GVariant *reply = NULL;
- GVariant *value;
- GVariantIter *iter;
- gchar *key;
- struct wps_bss_info_t *bss_info;
- GDBusConnection *conn = NULL;
- GError *error = NULL;
-
- conn = G_DBUS_CONNECTION(source_object);
- reply = g_dbus_connection_call_finish(conn, res, &error);
-
- if (error != NULL) {
- ERR("Error code: [%d] Error message: [%s]", error->code, error->message);
- g_error_free(error);
- goto done;
- }
-
- bss_info = g_try_new0(struct wps_bss_info_t, 1);
- if (bss_info == NULL)
- goto done;
-
- g_variant_get(reply, "(a{sv})", &iter);
- while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
- if (key != NULL) {
- if (g_strcmp0(key, "BSSID") == 0) {
- const guchar *bssid;
- gsize bssid_len;
-
- bssid = g_variant_get_fixed_array(value, &bssid_len, sizeof(guchar));
- if (bssid_len == NETCONFIG_BSSID_LEN)
- memcpy(bss_info->bssid, bssid, bssid_len);
- } else if (g_strcmp0(key, "SSID") == 0) {
- const guchar *ssid;
- gsize ssid_len;
-
- ssid = g_variant_get_fixed_array(value, &ssid_len, sizeof(guchar));
- if (ssid != NULL && ssid_len > 0 && ssid_len <= NETCONFIG_SSID_LEN) {
- memcpy(bss_info->ssid, ssid, ssid_len);
- bss_info->ssid_len = ssid_len;
- } else {
- memset(bss_info->ssid, 0, sizeof(bss_info->ssid));
- bss_info->ssid_len = 0;
- }
- } else if (g_strcmp0(key, "Mode") == 0) {
- gchar *mode = NULL;
-
- g_variant_get(value, "s", &mode);
- if (mode == NULL)
- bss_info->mode = 0;
- else {
- if (g_strcmp0(mode, "infrastructure") == 0)
- bss_info->mode = 1;
- else if (g_strcmp0(mode, "ad-hoc") == 0)
- bss_info->mode = 2;
- else
- bss_info->mode = 0;
- g_free(mode);
- }
- } else if (g_strcmp0(key, "Signal") == 0) {
- gint16 signal;
-
- signal = g_variant_get_int16(value);
- bss_info->rssi = signal;
- }
- }
- }
-
- if (bss_info->ssid[0] == '\0')
- g_free(bss_info);
- else
- wps_bss_info_list = g_slist_append(wps_bss_info_list, bss_info);