summaryrefslogtreecommitdiff
path: root/plugins/vpn.c
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2012-12-10 12:42:05 +0200
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-12-10 13:01:10 +0200
commit82f9db9759eae677b0b91c5c9c90ca21123e517f (patch)
tree0568670073ef8d397630986199dbf144d6750a71 /plugins/vpn.c
parent477bcfe9d54a71b5e0c93ac1bf38d62db705625d (diff)
downloadconnman-82f9db9759eae677b0b91c5c9c90ca21123e517f.tar.gz
connman-82f9db9759eae677b0b91c5c9c90ca21123e517f.tar.bz2
connman-82f9db9759eae677b0b91c5c9c90ca21123e517f.zip
vpn-plugin: Check completion of configure and connect
When creating a configuration, wait until both configuration and connection has been done. Otherwise NULL user data is passed to the callback which then cannot relay an error to the caller and the caller will get a timeout waiting for a reply from D-Bus.
Diffstat (limited to 'plugins/vpn.c')
-rw-r--r--plugins/vpn.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/plugins/vpn.c b/plugins/vpn.c
index 65a4853d..2f3d8607 100644
--- a/plugins/vpn.c
+++ b/plugins/vpn.c
@@ -1243,8 +1243,8 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
data = g_hash_table_lookup(vpn_connections, ident);
if (data != NULL) {
- if (data->call != NULL) {
- connman_error("Dbus call already pending");
+ if (data->call != NULL || data->cb_data != NULL) {
+ DBG("create configuration call already pending");
err = -EINPROGRESS;
goto done;
}
@@ -1274,6 +1274,18 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
dbus_message_set_sender(new_msg, me);
dbus_message_set_member(new_msg, "Create");
+ user_data = g_try_new0(struct config_create_data, 1);
+ if (user_data == NULL) {
+ err = -ENOMEM;
+ goto done;
+ }
+
+ user_data->callback = callback;
+ user_data->message = dbus_message_ref(msg);
+ user_data->path = NULL;
+
+ DBG("cb %p msg %p", user_data, msg);
+
result = dbus_connection_send_with_reply(connection, new_msg,
&call, DBUS_TIMEOUT);
if (result == FALSE || call == NULL) {
@@ -1281,20 +1293,6 @@ static int create_configuration(DBusMessage *msg, connection_ready_cb callback)
goto done;
}
- if (data->cb_data == NULL) {
- user_data = g_try_new(struct config_create_data, 1);
- if (user_data != NULL) {
- user_data->callback = callback;
- user_data->message = dbus_message_ref(msg);
- user_data->path = NULL;
-
- DBG("cb %p msg %p", user_data, msg);
- }
- } else {
- DBG("Configuration callback data already pending, "
- "discarding new data.");
- }
-
dbus_pending_call_set_notify(call, configuration_create_reply,
user_data, NULL);
data->call = call;