summaryrefslogtreecommitdiff
path: root/src/provider.c
diff options
context:
space:
mode:
authorMohamed Abbas <mohamed.abbas@intel.com>2010-09-22 04:35:35 -0700
committerSamuel Ortiz <sameo@linux.intel.com>2010-09-22 17:23:30 +0200
commit0afd84eff3503b6341c67e9f5b5f9e38dd73d3ce (patch)
treec4bb7302896872ae369ef8e9839cc2627f84588d /src/provider.c
parentdd16bc7188bb62028efdc82f56f04f9760c086b4 (diff)
downloadconnman-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.c23
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);
}