wispr: wispr_start will always re-start a new context
[framework/connectivity/connman.git] / src / provider.c
index 9ae62cd..9f7050f 100644 (file)
@@ -143,7 +143,7 @@ static void provider_unregister(struct connman_provider *provider)
 
 struct connman_provider *connman_provider_ref(struct connman_provider *provider)
 {
-       DBG("provider %p", provider);
+       DBG("provider %p refcount %d", provider, provider->refcount + 1);
 
        g_atomic_int_inc(&provider->refcount);
 
@@ -165,7 +165,7 @@ static void provider_destruct(struct connman_provider *provider)
 
 void connman_provider_unref(struct connman_provider *provider)
 {
-       DBG("provider %p", provider);
+       DBG("provider %p refcount %d", provider, provider->refcount - 1);
 
        if (g_atomic_int_dec_and_test(&provider->refcount) == FALSE)
                return;
@@ -359,6 +359,8 @@ int connman_provider_indicate_error(struct connman_provider *provider,
                                        enum connman_provider_error error)
 {
        enum connman_service_error service_error;
+       const char *path;
+       int ret;
 
        switch (error) {
        case CONNMAN_PROVIDER_ERROR_LOGIN_FAILED:
@@ -375,8 +377,12 @@ int connman_provider_indicate_error(struct connman_provider *provider,
                break;
        }
 
-       return __connman_service_indicate_error(provider->vpn_service,
+       ret = __connman_service_indicate_error(provider->vpn_service,
                                                        service_error);
+       path = __connman_service_get_path(provider->vpn_service);
+       __connman_provider_remove(path);
+
+       return ret;
 }
 
 static void unregister_provider(gpointer data)
@@ -533,6 +539,7 @@ int __connman_provider_create_and_connect(DBusMessage *msg)
 
                provider->host = g_strdup(host);
                provider->domain = g_strdup(domain);
+               g_free(provider->name);
                provider->name = g_strdup(name);
                provider->type = g_strdup(type);
 
@@ -571,11 +578,12 @@ int __connman_provider_create_and_connect(DBusMessage *msg)
                        err = -EOPNOTSUPP;
                        goto unref;
                }
-       }
 
-       err = __connman_service_connect(provider->vpn_service);
-       if (err < 0 && err != -EINPROGRESS)
-               goto failed;
+               err = __connman_service_connect(provider->vpn_service);
+               if (err < 0 && err != -EINPROGRESS)
+                       goto failed;
+       } else
+               DBG("provider already connected");
 
        service_path = __connman_service_get_path(provider->vpn_service);
        g_dbus_send_reply(connection, msg,
@@ -879,6 +887,9 @@ int connman_provider_append_route(struct connman_provider *provider,
 
 const char *connman_provider_get_driver_name(struct connman_provider *provider)
 {
+       if (provider->driver == NULL)
+               return NULL;
+
        return provider->driver->name;
 }