Imported Upstream connman version 1.38
[platform/upstream/connman.git] / src / provider.c
index 22ff08a..c437c91 100755 (executable)
@@ -141,12 +141,12 @@ int connman_provider_disconnect(struct connman_provider *provider)
                provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_DISCONNECT);
 
-       if (err < 0) {
-               if (err != -EINPROGRESS)
-                       return err;
+       if (err < 0)
+               return err;
 
-               return -EINPROGRESS;
-       }
+       if (provider->vpn_service)
+               provider_indicate_state(provider,
+                                       CONNMAN_SERVICE_STATE_IDLE);
 
        return 0;
 }
@@ -164,28 +164,36 @@ int connman_provider_remove(struct connman_provider *provider)
        return 0;
 }
 
-int __connman_provider_connect(struct connman_provider *provider)
+int __connman_provider_connect(struct connman_provider *provider,
+                                       const char *dbus_sender)
 {
        int err;
 
        DBG("provider %p", provider);
 
        if (provider->driver && provider->driver->connect)
-               err = provider->driver->connect(provider);
+               err = provider->driver->connect(provider, dbus_sender);
        else
                return -EOPNOTSUPP;
 
-       if (err < 0) {
-               if (err != -EINPROGRESS)
-                       return err;
+       switch (err) {
+       case 0:
+               return 0;
 
+       case -EINPROGRESS:
                provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_ASSOCIATION);
-
+               /* fall through */
+       /*
+        * Return EINPROGRESS also for when there is an existing pending call.
+        * The state should not be indicated again but the real state is
+        * still in progress for the provider.
+        */
+       case -EALREADY:
                return -EINPROGRESS;
        }
 
-       return 0;
+       return err;
 }
 
 int __connman_provider_remove_by_path(const char *path)
@@ -488,7 +496,7 @@ void connman_provider_set_index(struct connman_provider *provider, int index)
 
                ipconfig = __connman_service_get_ip4config(service);
                if (!ipconfig) {
-                       DBG("Couldnt create ipconfig");
+                       DBG("Couldn't create ipconfig");
                        goto done;
                }
        }
@@ -503,7 +511,7 @@ void connman_provider_set_index(struct connman_provider *provider, int index)
 
                ipconfig = __connman_service_get_ip6config(service);
                if (!ipconfig) {
-                       DBG("Couldnt create ipconfig for IPv6");
+                       DBG("Couldn't create ipconfig for IPv6");
                        goto done;
                }
        }
@@ -576,12 +584,29 @@ int connman_provider_set_nameservers(struct connman_provider *provider,
                return 0;
 
        for (i = 0; nameservers[i]; i++)
+#if defined TIZEN_EXT
+               __connman_service_nameserver_append(provider->vpn_service,
+                                               nameservers[i], false,
+                                               CONNMAN_IPCONFIG_TYPE_ALL);
+#else
                __connman_service_nameserver_append(provider->vpn_service,
                                                nameservers[i], false);
+#endif
 
        return 0;
 }
 
+void connman_provider_set_autoconnect(struct connman_provider *provider,
+                                                               bool flag)
+{
+       if (!provider || !provider->vpn_service)
+               return;
+
+       /* Save VPN service if autoconnect value changes */
+       if (connman_service_set_autoconnect(provider->vpn_service, flag))
+               __connman_service_save(provider->vpn_service);
+}
+
 static void unregister_provider(gpointer data)
 {
        struct connman_provider *provider = data;
@@ -735,7 +760,7 @@ static void provider_service_changed(struct connman_service *service,
        vpn_index = __connman_connection_get_vpn_index(service_index);
 
        DBG("service %p %s state %d index %d/%d", service,
-               __connman_service_get_ident(service),
+               connman_service_get_identifier(service),
                state, service_index, vpn_index);
 
        if (vpn_index < 0)
@@ -748,11 +773,9 @@ static void provider_service_changed(struct connman_service *service,
        DBG("disconnect %p index %d", provider, vpn_index);
 
        connman_provider_disconnect(provider);
-
-       return;
 }
 
-static struct connman_notifier provider_notifier = {
+static const struct connman_notifier provider_notifier = {
        .name                   = "provider",
        .offline_mode           = provider_offline_mode,
        .service_state_changed  = provider_service_changed,