summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorJussi Laakkonen <jussi.laakkonen@jolla.com>2021-04-01 17:46:08 +0300
committerDaniel Wagner <wagi@monom.org>2021-04-05 15:37:28 +0200
commitf6360fcfca6e423f117aeb05cfbde37cbb1ee9f1 (patch)
treee29e15843ca482d5e420164c7385de71a7632565 /plugins
parent3fed7f91ee8acb934f9f795c79640533d1f268ca (diff)
downloadconnman-f6360fcfca6e423f117aeb05cfbde37cbb1ee9f1.tar.gz
vpn: Return transport ident with get_property()
Return the service_ident with "Transport" keyword given to get_property(). Plugin tracks the transport and this is can be used elsewhere as well. It is important to free the service_ident after notifying provider about state change as the service_ident is used for IPv6 checks when disconnecting.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/vpn.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/plugins/vpn.c b/plugins/vpn.c
index 3ed9c322..d708d1ff 100644
--- a/plugins/vpn.c
+++ b/plugins/vpn.c
@@ -153,6 +153,8 @@ static const char *get_string(struct connman_provider *provider,
return data->host_ip[0];
} else if (g_str_equal(key, "VPN.Domain"))
return data->domain;
+ else if (g_str_equal(key, "Transport"))
+ return data->service_ident;
return g_hash_table_lookup(data->setting_strings, key);
}
@@ -268,14 +270,12 @@ static bool provider_is_connected(struct connection_data *data)
static void set_provider_state(struct connection_data *data)
{
enum connman_provider_state state = CONNMAN_PROVIDER_STATE_UNKNOWN;
+ bool connected;
int err = 0;
DBG("provider %p new state %s", data->provider, data->state);
- if (!provider_is_connected(data)) {
- g_free(data->service_ident);
- data->service_ident = NULL;
- }
+ connected = provider_is_connected(data);
if (g_str_equal(data->state, "ready")) {
state = CONNMAN_PROVIDER_STATE_READY;
@@ -295,7 +295,7 @@ static void set_provider_state(struct connection_data *data)
}
connman_provider_set_state(data->provider, state);
- return;
+ goto free;
set:
if (data->cb_data)
@@ -306,6 +306,12 @@ set:
free_config_cb_data(data->cb_data);
data->cb_data = NULL;
+
+free:
+ if (!connected) {
+ g_free(data->service_ident);
+ data->service_ident = NULL;
+ }
}
static int create_provider(struct connection_data *data, void *user_data)
@@ -1032,12 +1038,14 @@ static int disconnect_provider(struct connection_data *data)
dbus_pending_call_set_notify(data->disconnect_call, disconnect_reply,
data, NULL);
- g_free(data->service_ident);
- data->service_ident = NULL;
data->default_route_set = false;
connman_provider_set_state(data->provider,
CONNMAN_PROVIDER_STATE_DISCONNECT);
+
+ g_free(data->service_ident);
+ data->service_ident = NULL;
+
return -EINPROGRESS;
}