diff options
author | Jussi Laakkonen <jussi.laakkonen@jolla.com> | 2021-04-01 17:46:08 +0300 |
---|---|---|
committer | Daniel Wagner <wagi@monom.org> | 2021-04-05 15:37:28 +0200 |
commit | f6360fcfca6e423f117aeb05cfbde37cbb1ee9f1 (patch) | |
tree | e29e15843ca482d5e420164c7385de71a7632565 /plugins | |
parent | 3fed7f91ee8acb934f9f795c79640533d1f268ca (diff) | |
download | connman-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.c | 22 |
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; } |