X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=plugins%2Fsupplicant.c;h=bca325de1e82ae0d9c4e14366f8d70b6aa055fa4;hb=f883452f576d8f9e51d2b474f5a5d4d33ab093f9;hp=b7d01cf8b5e1e57f4665777240820db7336cba16;hpb=b481384506a522d3172e25d71456e0f78a9c0268;p=connman diff --git a/plugins/supplicant.c b/plugins/supplicant.c index b7d01cf..bca325d 100644 --- a/plugins/supplicant.c +++ b/plugins/supplicant.c @@ -23,6 +23,7 @@ #include #endif +#include #include #include @@ -502,12 +503,45 @@ static int set_network(struct supplicant_task *task, connman_dbus_dict_append_array(&dict, "ssid", DBUS_TYPE_BYTE, &network, len); - if (passphrase && strlen(passphrase) > 0) { + if (g_ascii_strcasecmp(security, "wpa") == 0 || + g_ascii_strcasecmp(security, "wpa2") == 0) { const char *key_mgmt = "WPA-PSK"; connman_dbus_dict_append_variant(&dict, "key_mgmt", DBUS_TYPE_STRING, &key_mgmt); - connman_dbus_dict_append_variant(&dict, "psk", + + if (passphrase && strlen(passphrase) > 0) + connman_dbus_dict_append_variant(&dict, "psk", DBUS_TYPE_STRING, &passphrase); + } else if (g_ascii_strcasecmp(security, "wep") == 0) { + const char *key_mgmt = "NONE", *index = "0"; + connman_dbus_dict_append_variant(&dict, "key_mgmt", + DBUS_TYPE_STRING, &key_mgmt); + + if (passphrase) { + int size = strlen(passphrase); + if (size == 10 || size == 26) { + unsigned char *key = malloc(13); + char tmp[3]; + int i; + memset(tmp, 0, sizeof(tmp)); + if (key == NULL) + size = 0; + for (i = 0; i < size / 2; i++) { + memcpy(tmp, passphrase + (i * 2), 2); + key[i] = (unsigned char) strtol(tmp, + NULL, 16); + } + connman_dbus_dict_append_array(&dict, + "wep_key0", DBUS_TYPE_BYTE, + &key, size / 2); + free(key); + } else + connman_dbus_dict_append_variant(&dict, + "wep_key0", DBUS_TYPE_STRING, + &passphrase); + connman_dbus_dict_append_variant(&dict, "wep_tx_keyidx", + DBUS_TYPE_STRING, &index); + } } else { const char *key_mgmt = "NONE"; connman_dbus_dict_append_variant(&dict, "key_mgmt", @@ -755,6 +789,9 @@ static void scan_results_reply(DBusPendingCall *call, void *user_data) goto done; } + if (task->callback && task->callback->clear_results) + task->callback->clear_results(task->element); + for (i = 0; i < num_results; i++) get_network_properties(task, results[i]); @@ -1062,8 +1099,28 @@ int __supplicant_disconnect(struct connman_element *element) return 0; } +void __supplicant_activate(DBusConnection *conn) +{ + DBusMessage *message; + + DBG("conn %p", conn); + + message = dbus_message_new_method_call(SUPPLICANT_NAME, "/", + DBUS_INTERFACE_INTROSPECTABLE, "Introspect"); + if (message == NULL) + return; + + dbus_message_set_no_reply(message, TRUE); + + dbus_connection_send(conn, message, NULL); + + dbus_message_unref(message); +} + int __supplicant_init(DBusConnection *conn) { + DBG("conn %p", conn); + connection = conn; if (dbus_connection_add_filter(connection, @@ -1077,5 +1134,7 @@ int __supplicant_init(DBusConnection *conn) void __supplicant_exit(void) { + DBG("conn %p", connection); + dbus_connection_remove_filter(connection, supplicant_filter, NULL); }