summaryrefslogtreecommitdiff
path: root/src/network.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-06-15 16:00:21 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-06-18 10:57:08 +0300
commitfc41a18566f0bb753fd8ce35873d1442942f464c (patch)
treef198bceea5eac8f186f15fd13eae23b9c1e13b11 /src/network.c
parent3ca789e446848eed6ca3c00af080cd737d115dcb (diff)
downloadconnman-fc41a18566f0bb753fd8ce35873d1442942f464c.tar.gz
connman-fc41a18566f0bb753fd8ce35873d1442942f464c.tar.bz2
connman-fc41a18566f0bb753fd8ce35873d1442942f464c.zip
service: Connecting hidden network waits until connected
If the user is connecting to hidden network, then we delay the return of the reply to caller until the real service has connected. This way the user connect to hidden and non-hidden networks works the same way from caller point of view.
Diffstat (limited to 'src/network.c')
-rw-r--r--src/network.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/network.c b/src/network.c
index 6fe1d9c5..bf017676 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1455,17 +1455,36 @@ connman_bool_t connman_network_get_associating(struct connman_network *network)
return network->associating;
}
+void connman_network_clear_hidden(void *user_data)
+{
+ if (user_data == NULL)
+ return;
+
+ DBG("user_data %p", user_data);
+
+ /*
+ * Hidden service does not have a connect timeout so
+ * we do not need to remove it. We can just return
+ * error to the caller telling that we could not find
+ * any network that we could connect to.
+ */
+ __connman_service_reply_dbus_pending(user_data, EIO);
+}
+
int connman_network_connect_hidden(struct connman_network *network,
- char *identity, char* passphrase)
+ char *identity, char* passphrase, void *user_data)
{
int err = 0;
struct connman_service *service;
- DBG("");
-
service = __connman_service_lookup_from_network(network);
- if (service == NULL)
- return -EINVAL;
+
+ DBG("network %p service %p user_data %p", network, service, user_data);
+
+ if (service == NULL) {
+ err = -EINVAL;
+ goto out;
+ }
if (identity != NULL)
__connman_service_set_agent_identity(service, identity);
@@ -1476,12 +1495,17 @@ int connman_network_connect_hidden(struct connman_network *network,
if (err == -ENOKEY) {
__connman_service_indicate_error(service,
CONNMAN_SERVICE_ERROR_INVALID_KEY);
- return err;
+ goto out;
} else {
__connman_service_set_hidden(service);
__connman_service_set_userconnect(service, TRUE);
+ __connman_service_set_hidden_data(service, user_data);
return __connman_service_connect(service);
}
+
+out:
+ __connman_service_return_error(service, -err, user_data);
+ return err;
}
/**