diff options
author | Mohamed Abbas <mohamed.abbas@intel.com> | 2010-09-22 04:35:35 -0700 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-09-22 17:23:30 +0200 |
commit | 0afd84eff3503b6341c67e9f5b5f9e38dd73d3ce (patch) | |
tree | c4bb7302896872ae369ef8e9839cc2627f84588d /src/provider.c | |
parent | dd16bc7188bb62028efdc82f56f04f9760c086b4 (diff) | |
download | connman-0afd84eff3503b6341c67e9f5b5f9e38dd73d3ce.tar.gz connman-0afd84eff3503b6341c67e9f5b5f9e38dd73d3ce.tar.bz2 connman-0afd84eff3503b6341c67e9f5b5f9e38dd73d3ce.zip |
Fix bug to remove vpn services when turning offline mode on
This patch will remove all vpn services on offline mode. It also
make sure it exits after releasing all resources.
Fixes BMC #6591
Diffstat (limited to 'src/provider.c')
-rw-r--r-- | src/provider.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/provider.c b/src/provider.c index b0117780..b7dc9e9d 100644 --- a/src/provider.c +++ b/src/provider.c @@ -165,7 +165,8 @@ int __connman_provider_disconnect(struct connman_provider *provider) else return -EOPNOTSUPP; - __connman_service_indicate_state(provider->vpn_service, + if (provider->vpn_service != NULL) + __connman_service_indicate_state(provider->vpn_service, CONNMAN_SERVICE_STATE_DISCONNECT); if (err < 0) { if (err != -EINPROGRESS) @@ -333,10 +334,12 @@ int connman_provider_set_state(struct connman_provider *provider, static void unregister_provider(gpointer data) { struct connman_provider *provider = data; + struct connman_service *service = provider->vpn_service; DBG("provider %p", provider); - __connman_service_put(provider->vpn_service); + provider->vpn_service = NULL; + __connman_service_put(service); connman_element_unregister(&provider->element); connman_provider_unref(provider); @@ -537,7 +540,8 @@ int __connman_provider_create_and_connect(DBusMessage *msg) if (created == TRUE) provider_probe(provider); - provider->vpn_service = + if (provider->vpn_service == NULL) + provider->vpn_service = __connman_service_create_from_provider(provider); if (provider->vpn_service == NULL) { err = -EOPNOTSUPP; @@ -559,8 +563,10 @@ failed: DBG("can not connect delete provider"); connman_provider_unref(provider); - if (provider->vpn_service != NULL) + if (provider->vpn_service != NULL) { __connman_service_put(provider->vpn_service); + provider->vpn_service = NULL; + } } return err; @@ -640,6 +646,9 @@ void connman_provider_set_index(struct connman_provider *provider, int index) DBG(""); + if (service == NULL) + return; + ipconfig = __connman_service_get_ipconfig(service); if (ipconfig == NULL) { @@ -694,12 +703,12 @@ void connman_provider_driver_unregister(struct connman_provider_driver *driver) driver_list = g_slist_remove(driver_list, driver); } -static void provider_disconnect(gpointer key, gpointer value, +static void provider_remove(gpointer key, gpointer value, gpointer user_data) { struct connman_provider *provider = value; - __connman_provider_disconnect(provider); + g_hash_table_remove(provider_hash, provider->identifier); } static void provider_offline_mode(connman_bool_t enabled) @@ -707,7 +716,7 @@ static void provider_offline_mode(connman_bool_t enabled) DBG("enabled %d", enabled); if (enabled == TRUE) - g_hash_table_foreach(provider_hash, provider_disconnect, NULL); + g_hash_table_foreach(provider_hash, provider_remove, NULL); } |