From: Daniel Wagner <daniel.wag...@bmw-carit.de>

Since we know if a service was connected by a user or by a session
we can use this information and disconnect the service if there
is no user asking for it.
---
 src/service.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/service.c b/src/service.c
index 48fb5c4..d852c38 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3575,9 +3575,35 @@ static void add_service_to_session(struct 
connman_session *session)
        }
 }
 
+static void disconnect_service_on_last_session(struct connman_service *service)
+{
+       GHashTableIter iter;
+       gpointer key, value;
+
+       DBG("service %p reason %s", service,
+               reason2string(service->connect_reason));
+
+       if (!is_connected(service))
+               return;
+
+       if(service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_SESSION)
+               return;
+
+       g_hash_table_iter_init(&iter, session_hash);
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               struct session_info *info = value;
+
+               if (info->service == service)
+                       return;
+       }
+
+       __connman_service_disconnect(service);
+}
+
 static void remove_service_from_session(struct connman_session *session)
 {
        struct session_info *info;
+       struct connman_service *service;
 
        info = g_hash_table_lookup(session_hash, session);
        if (!info)
@@ -3587,7 +3613,10 @@ static void remove_service_from_session(struct 
connman_session *session)
                return;
 
        __connman_session_remove_service(session, info->service);
+       service = info->service;
        info->service = NULL;
+
+       disconnect_service_on_last_session(service);
 }
 
 void __connman_service_set_active_session(struct connman_session *session,
-- 
1.8.5.3

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to