summaryrefslogtreecommitdiff
path: root/src/provider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/provider.c')
-rw-r--r--src/provider.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/provider.c b/src/provider.c
index 52f3ade3..251d0b05 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -898,6 +898,7 @@ int __connman_provider_create_and_connect(DBusMessage *msg)
char **networks = NULL;
char *ident;
int err, count = 0;
+ connman_bool_t connecting = FALSE;
dbus_message_iter_init(msg, &iter);
dbus_message_iter_recurse(&iter, &array);
@@ -1004,14 +1005,40 @@ int __connman_provider_create_and_connect(DBusMessage *msg)
if (err == -EOPNOTSUPP) {
goto unref;
} else {
+ if (__connman_service_is_provider_pending(
+ provider->vpn_service) == TRUE) {
+ DBG("Provider %p connection already pending",
+ provider);
+ dbus_message_ref(msg);
+ __connman_service_reply_dbus_pending(msg,
+ EINPROGRESS, NULL);
+ return 0;
+ }
+
err = __connman_service_connect(provider->vpn_service);
if (err < 0 && err != -EINPROGRESS)
goto failed;
+
+ if (err == -EINPROGRESS)
+ connecting = TRUE;
}
}
- connman_provider_save(provider);
+ if (connecting == TRUE) {
+ /*
+ * Save the dbus message so that we can reply the
+ * caller when VPN connection is established.
+ */
+ dbus_message_ref(msg);
+
+ __connman_service_set_provider_pending(provider->vpn_service,
+ msg);
+ connman_provider_save(provider);
+
+ return 0;
+ }
+
service_path = __connman_service_get_path(provider->vpn_service);
g_dbus_send_reply(connection, msg,
DBUS_TYPE_OBJECT_PATH, &service_path,