From: Patrik Flykt <[email protected]>

If SingleConnection is enabled in main.conf, disconnect any previously
connected services when the new service enters ready state.
---
 src/service.c |   31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/src/service.c b/src/service.c
index b85e604..6f00cd1 100644
--- a/src/service.c
+++ b/src/service.c
@@ -4943,6 +4943,34 @@ static int service_update_preferred_order(struct 
connman_service *default_servic
        return -EALREADY;
 }
 
+static void service_single_connection(struct connman_service *allowed)
+{
+       GSequenceIter *iter;
+       GSList *services = NULL, *list;
+
+       iter = g_sequence_get_begin_iter(service_list);
+
+       while (g_sequence_iter_is_end(iter) == FALSE) {
+               struct connman_service *service = g_sequence_get(iter);
+
+               if (service != allowed && is_connected(service))
+                       services = g_slist_prepend(services, service);
+
+               iter = g_sequence_iter_next(iter);
+       }
+
+       DBG("keeping %p %s", allowed, allowed->path);
+
+       for (list = services; list != NULL; list = list->next) {
+               struct connman_service *service = list->data;
+
+               DBG("disconnecting %p %s", service, service->path);
+               __connman_service_disconnect(service);
+       }
+
+       g_slist_free(services);
+}
+
 static int service_indicate_state(struct connman_service *service)
 {
        enum connman_service_state old_state, new_state;
@@ -5068,6 +5096,9 @@ static int service_indicate_state(struct connman_service 
*service)
                        __connman_ipconfig_disable_ipv6(
                                                service->ipconfig_ipv6);
 
+               if (connman_setting_get_bool("SingleConnection") == TRUE)
+                       service_single_connection(service);
+
        } else if (new_state == CONNMAN_SERVICE_STATE_DISCONNECT) {
                def_service = __connman_service_get_default();
 
-- 
1.7.10.4

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to