X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=plugins%2Fsupplicant.c;h=69e79eb2261800a23f208c761752b33236c885f5;hb=6e84765a8dda6c0cb5f13fbaf7bdecf9016c8de4;hp=f78a3f5fae272cc6922c9e654a1c008501e9c8d9;hpb=8cba7d766c9c081091975595575ada98e34ad218;p=connman diff --git a/plugins/supplicant.c b/plugins/supplicant.c index f78a3f5..69e79eb 100644 --- a/plugins/supplicant.c +++ b/plugins/supplicant.c @@ -279,6 +279,12 @@ static int add_interface(struct supplicant_task *task) return -EIO; } + if (call == NULL) { + connman_error("D-Bus connection not available"); + dbus_message_unref(message); + return -EIO; + } + dbus_pending_call_set_notify(call, add_interface_reply, task, NULL); dbus_message_unref(message); @@ -349,6 +355,12 @@ static int create_interface(struct supplicant_task *task) return -EIO; } + if (call == NULL) { + connman_error("D-Bus connection not available"); + dbus_message_unref(message); + return -EIO; + } + dbus_pending_call_set_notify(call, get_interface_reply, task, NULL); dbus_message_unref(message); @@ -369,6 +381,8 @@ static void remove_interface_reply(DBusPendingCall *call, void *user_data) connman_device_unref(task->device); + inet_ifdown(task->ifindex); + free_task(task); dbus_message_unref(reply); @@ -401,6 +415,12 @@ static int remove_interface(struct supplicant_task *task) return -EIO; } + if (call == NULL) { + connman_error("D-Bus connection not available"); + dbus_message_unref(message); + return -EIO; + } + dbus_pending_call_set_notify(call, remove_interface_reply, task, NULL); dbus_message_unref(message); @@ -680,21 +700,17 @@ static int set_network(struct supplicant_task *task, DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); - if (len > 0) { - if (address == NULL) { - const char *scan = "1"; - connman_dbus_dict_append_variant(&dict, "scan_ssid", - DBUS_TYPE_STRING, &scan); - } - - connman_dbus_dict_append_array(&dict, "ssid", - DBUS_TYPE_BYTE, &network, len); - } - - if (address != NULL) + if (address == NULL) { + dbus_uint32_t scan_ssid = 1; + connman_dbus_dict_append_variant(&dict, "scan_ssid", + DBUS_TYPE_UINT32, &scan_ssid); + } else connman_dbus_dict_append_variant(&dict, "bssid", DBUS_TYPE_STRING, &address); + connman_dbus_dict_append_array(&dict, "ssid", + DBUS_TYPE_BYTE, &network, len); + if (g_ascii_strcasecmp(security, "wpa") == 0 || g_ascii_strcasecmp(security, "wpa2") == 0) { const char *key_mgmt = "WPA-PSK"; @@ -787,6 +803,36 @@ static int initiate_scan(struct supplicant_task *task) return 0; } +static char *build_group(const char *addr, + const unsigned char *ssid, unsigned int ssid_len, + const char *mode, const char *security) +{ + GString *str; + unsigned int i; + + if (ssid_len > 0 && ssid[0] != '\0') { + str = g_string_sized_new((ssid_len * 2) + 24); + if (str == NULL) + return NULL; + + for (i = 0; i < ssid_len; i++) + g_string_append_printf(str, "%02x", ssid[i]); + } else { + if (addr == NULL) + return NULL; + + str = g_string_sized_new(15 + 24); + if (str == NULL) + return NULL; + + g_string_append_printf(str, "hidden_%s", addr); + } + + g_string_append_printf(str, "_%s_%s", mode, security); + + return g_string_free(str, FALSE); +} + static void extract_addr(DBusMessageIter *value, struct supplicant_result *result) { @@ -819,7 +865,7 @@ static void extract_addr(DBusMessageIter *value, if (result->path == NULL) return; - snprintf(result->path, 18, "%02X_%02X_%02X_%02X_%02X_%02X", + snprintf(result->path, 18, "%02x%02x%02x%02x%02x%02x", eth->ether_addr_octet[0], eth->ether_addr_octet[1], eth->ether_addr_octet[2], @@ -923,8 +969,9 @@ static void properties_reply(DBusPendingCall *call, void *user_data) struct connman_network *network; DBusMessage *reply; DBusMessageIter array, dict; - const char *mode, *security; unsigned char strength; + const char *mode, *security; + char *group; DBG("task %p", task); @@ -1015,6 +1062,11 @@ static void properties_reply(DBusPendingCall *call, void *user_data) else security = "none"; + mode = (result.adhoc == TRUE) ? "adhoc" : "managed"; + + group = build_group(result.path, result.ssid, result.ssid_len, + mode, security); + network = connman_device_get_network(task->device, result.path); if (network == NULL) { int index; @@ -1032,23 +1084,37 @@ static void properties_reply(DBusPendingCall *call, void *user_data) connman_network_set_string(network, "Address", result.addr); + connman_network_set_group(network, group); + + if (result.name != NULL && result.name[0] != '\0') + connman_network_set_string(network, "Name", result.name); + + connman_network_set_uint8(network, "Strength", strength); + + connman_network_set_string(network, "WiFi.Mode", mode); + connman_network_set_string(network, "WiFi.Security", security); + if (connman_device_add_network(task->device, network) < 0) { connman_network_unref(network); goto done; } } - connman_network_set_string(network, "Name", result.name); + connman_network_set_group(network, group); + + g_free(group); + + if (result.name != NULL && result.name[0] != '\0') + connman_network_set_string(network, "Name", result.name); connman_network_set_blob(network, "WiFi.SSID", result.ssid, result.ssid_len); - mode = (result.adhoc == TRUE) ? "adhoc" : "managed"; connman_network_set_string(network, "WiFi.Mode", mode); DBG("%s (%s %s) strength %d (%s)", - result.name, mode, security, strength, - (result.has_wps == TRUE) ? "WPS" : "no WPS"); + result.name, mode, security, strength, + (result.has_wps == TRUE) ? "WPS" : "no WPS"); connman_network_set_available(network, TRUE); connman_network_set_uint8(network, "Strength", strength); @@ -1093,6 +1159,12 @@ static void get_properties(struct supplicant_task *task) goto noscan; } + if (call == NULL) { + connman_error("D-Bus connection not available"); + dbus_message_unref(message); + goto noscan; + } + dbus_pending_call_set_notify(call, properties_reply, task, NULL); dbus_message_unref(message); @@ -1184,6 +1256,11 @@ static void scan_results_available(struct supplicant_task *task) if (task->noscan == FALSE) connman_device_set_scanning(task->device, TRUE); + if (call == NULL) { + connman_error("D-Bus connection not available"); + goto done; + } + dbus_pending_call_set_notify(call, scan_results_reply, task, NULL); done: @@ -1276,7 +1353,11 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg) connman_network_set_connected(task->network, FALSE); connman_device_set_scanning(task->device, FALSE); break; + case WPA_ASSOCIATING: + connman_network_set_associating(task->network, TRUE); + break; default: + connman_network_set_associating(task->network, FALSE); break; } } @@ -1433,6 +1514,8 @@ int supplicant_connect(struct connman_network *network) enable_network(task); + connman_network_set_associating(task->network, TRUE); + return 0; }