static int task_connect(struct supplicant_task *task) { const char *address, *security, *passphrase; const void *ssid; unsigned int ssid_len; int err; address = connman_network_get_string(task->network, "Address"); security = connman_network_get_string(task->network, "WiFi.Security"); passphrase = connman_network_get_string(task->network, "WiFi.Passphrase"); ssid = connman_network_get_blob(task->network, "WiFi.SSID", &ssid_len); _DBG_SUPPLICANT("address %s security %s", address, security); if (security == NULL && passphrase == NULL) return -EINVAL; if (g_str_equal(security, "none") == FALSE && passphrase == NULL) return -EINVAL; remove_network(task); set_ap_scan(task); add_network(task); set_network(task, ssid, ssid_len, address, security, passphrase); err = select_network(task); if (err < 0) return err; return -EINPROGRESS; }
static int pan_disconnect(struct connman_network *network) { const char *path = connman_network_get_string(network, "Path"); DBusMessage *message; DBusPendingCall *call; DBG("network %p", network); if (!path) return -EINVAL; message = dbus_message_new_method_call(BLUEZ_SERVICE, path, BLUEZ_NETWORK_INTERFACE, DISCONNECT); if (!message) return -ENOMEM; dbus_message_set_auto_start(message, FALSE); dbus_message_append_args(message, DBUS_TYPE_INVALID); if (!dbus_connection_send_with_reply(connection, message, &call, TIMEOUT)) { connman_error("Failed to disconnect service"); dbus_message_unref(message); return -EINVAL; } if (!call) { connman_error("D-Bus connection not available"); dbus_message_unref(message); return -EINVAL; } connman_network_ref(network); connman_network_set_associating(network, false); dbus_pending_call_set_notify(call, disconnect_reply, g_strdup(path), g_free); dbus_message_unref(message); return 0; }
static int pan_connect(struct connman_network *network) { const char *path = connman_network_get_string(network, "Path"); const char *uuid = "nap"; DBusMessage *message; DBusPendingCall *call; DBG("network %p", network); if (path == NULL) return -EINVAL; message = dbus_message_new_method_call(BLUEZ_SERVICE, path, BLUEZ_NETWORK_INTERFACE, CONNECT); if (message == NULL) return -ENOMEM; dbus_message_set_auto_start(message, FALSE); dbus_message_append_args(message, DBUS_TYPE_STRING, &uuid, DBUS_TYPE_INVALID); if (dbus_connection_send_with_reply(connection, message, &call, TIMEOUT * 10) == FALSE) { connman_error("Failed to connect service"); dbus_message_unref(message); return -EINVAL; } if (call == NULL) { connman_error("D-Bus connection not available"); dbus_message_unref(message); return -EINVAL; } dbus_pending_call_set_notify(call, connect_reply, network, NULL); dbus_message_unref(message); return -EINPROGRESS; }
static void previous_passphrase_handler(DBusMessageIter *iter, struct connman_service *service) { enum connman_service_security security; struct previous_passphrase_data data; struct connman_network *network; network = __connman_service_get_network(service); data.passphrase = connman_network_get_string(network, "WiFi.PinWPS"); if (connman_network_get_bool(network, "WiFi.UseWPS") && data.passphrase) { data.type = "wpspin"; } else { data.passphrase = __connman_service_get_passphrase(service); if (!data.passphrase) return; security = __connman_service_get_security(service); switch (security) { case CONNMAN_SERVICE_SECURITY_WEP: data.type = "wep"; break; case CONNMAN_SERVICE_SECURITY_PSK: data.type = "psk"; break; /* * This should never happen: no passphrase is set if security * is not one of the above. */ default: break; } } connman_dbus_dict_append_dict(iter, "PreviousPassphrase", request_input_append_previouspassphrase, &data); }
void __connman_device_set_network(struct connman_device *device, struct connman_network *network) { const char *name; if (device == NULL) return; if (device->network == network) return; if (network != NULL) { name = connman_network_get_string(network, "Name"); g_free(device->last_network); device->last_network = g_strdup(name); device->network = network; } else { g_free(device->last_network); device->last_network = NULL; device->network = NULL; } }