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);
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;
enum connman_provider_error error)
{
enum connman_service_error service_error;
+ const char *path;
+ int ret;
switch (error) {
case CONNMAN_PROVIDER_ERROR_LOGIN_FAILED:
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)
provider->host = g_strdup(host);
provider->domain = g_strdup(domain);
+ g_free(provider->name);
provider->name = g_strdup(name);
provider->type = g_strdup(type);
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,
const char *connman_provider_get_driver_name(struct connman_provider *provider)
{
+ if (provider->driver == NULL)
+ return NULL;
+
return provider->driver->name;
}