---
src/service.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 67 insertions(+), 11 deletions(-)
diff --git a/src/service.c b/src/service.c
index 2cfbdb8..fbf9431 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1148,6 +1148,19 @@ static struct connman_service
*__connman_service_lookup(const char *identifier)
return NULL;
}
+static void convert_name(const char *ssid, char *name,
+ unsigned int ssid_len)
+{
+ unsigned int i;
+
+ for (i = 0; i < ssid_len; i++) {
+ if (g_ascii_isprint(ssid[i]))
+ name[i] = ssid[i];
+ else
+ name[i] = ' ';
+ }
+}
+
int __connman_service_create_and_connect(DBusMessage *msg)
{
struct connman_service *service;
@@ -1155,6 +1168,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
DBusMessageIter iter, array;
const char *mode = "managed", *security = "none";
const char *type = NULL, *ssid = NULL, *passphrase = NULL;
+ unsigned int ssid_len = 0;
const char *ident;
char *name, *group;
int err;
@@ -1202,6 +1216,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
if (ssid == NULL)
return -EINVAL;
+ ssid_len = strlen(ssid);
device = __connman_element_find_device(CONNMAN_DEVICE_TYPE_WIFI);
if (device == NULL)
return -EOPNOTSUPP;
@@ -1211,14 +1226,12 @@ int __connman_service_create_and_connect(DBusMessage
*msg)
return -EOPNOTSUPP;
group = connman_wifi_build_group_name((unsigned char *) ssid,
- strlen(ssid), mode, security);
+ ssid_len, mode, security);
if (group == NULL)
return -EINVAL;
name = g_strdup_printf("%s_%s_%s", type, ident, group);
- g_free(group);
-
service = __connman_service_lookup(name);
g_free(name);
@@ -1228,19 +1241,62 @@ int __connman_service_create_and_connect(DBusMessage
*msg)
g_free(service->passphrase);
service->passphrase = g_strdup(passphrase);
}
+ } else {
+ struct connman_network *network;
+ char *net_name;
+ int index;
+
+ network = connman_network_create("00_00_00_00_00_00",
+ CONNMAN_NETWORK_TYPE_WIFI);
+ if (network == NULL) {
+ g_free(group);
+ return -ENOMEM;
+ }
- err = __connman_service_connect(service);
- if (err < 0 && err != -EINPROGRESS)
- return err;
+ connman_network_set_blob(network, "WiFi.SSID", ssid, ssid_len);
- g_dbus_send_reply(connection, msg,
- DBUS_TYPE_OBJECT_PATH, &service->path,
- DBUS_TYPE_INVALID);
+ net_name = g_try_malloc0(ssid_len + 1);
+ if (name == NULL) {
+ g_free(group);
+ return -ENOMEM;
+ }
- return 0;
+ convert_name(ssid, net_name, ssid_len);
+ connman_network_set_name(network, net_name);
+ g_free(net_name);
+
+ connman_network_set_string(network, "WiFi.Mode", mode);
+ connman_network_set_string(network, "WiFi.Security", security);
+ connman_network_set_string(network, "WiFi.Passphrase",
passphrase);
+
+ connman_network_set_group(network, group);
+
+ index = connman_device_get_index(device);
+ connman_network_set_index(network, index);
+
+ connman_network_set_protocol(network,
+ CONNMAN_NETWORK_PROTOCOL_IP);
+
+ connman_device_add_network(device, network);
+
+ connman_network_set_available(network, TRUE);
+
+ service = __connman_service_lookup_from_network(network);
}
- return -EOPNOTSUPP;
+ g_free(group);
+
+ if (service == NULL)
+ return -EOPNOTSUPP;
+
+ err = __connman_service_connect(service);
+ if (err < 0 && err != -EINPROGRESS)
+ return err;
+
+ g_dbus_send_reply(connection, msg,
+ DBUS_TYPE_OBJECT_PATH, &service->path,
+ DBUS_TYPE_INVALID);
+ return 0;
}
/**
--
1.6.1.3
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman