We internally keep a count of registered services which are set as
master. This will be then useful afterwards to set the GO intent from
the wifi plugin and gsupplicant, transparently.
---
 src/connman.h      |  3 ++-
 src/manager.c      |  2 +-
 src/peer_service.c | 20 ++++++++++++++++++--
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index a871e82..daad623 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -806,7 +806,8 @@ int __connman_peer_service_register(const char *owner, 
DBusMessage *msg,
                                        const unsigned char *specification,
                                        int specification_length,
                                        const unsigned char *query,
-                                       int query_length, int version);
+                                       int query_length, int version,
+                                       bool master);
 int __connman_peer_service_unregister(const char *owner,
                                        const unsigned char *specification,
                                        int specification_length,
diff --git a/src/manager.c b/src/manager.c
index 3c5636c..03ea523 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -460,7 +460,7 @@ static DBusMessage *register_peer_service(DBusConnection 
*conn,
        dbus_message_iter_get_basic(&iter, &master);
 
        ret = __connman_peer_service_register(owner, msg, spec, spec_len,
-                                               query, query_len, version);
+                                       query, query_len, version,master);
        if (!ret)
                return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
        if (ret == -EINPROGRESS)
diff --git a/src/peer_service.c b/src/peer_service.c
index f1985fd..8fc0247 100644
--- a/src/peer_service.c
+++ b/src/peer_service.c
@@ -39,6 +39,8 @@ struct _peer_service {
        GBytes *specification;
        GBytes *query;
        int version;
+
+       bool master;
 };
 
 struct _peer_service_owner {
@@ -51,6 +53,7 @@ static struct connman_peer_driver *peer_driver;
 
 static GHashTable *owners_map;
 static GHashTable *services_map;
+static int peer_master;
 
 static void reply_pending(struct _peer_service *service, int error)
 {
@@ -149,6 +152,9 @@ static void remove_peer_service(gpointer user_data)
        if (service->query)
                g_bytes_unref(service->query);
 
+       if (service->master)
+               peer_master--;
+
        g_free(service);
 }
 
@@ -197,6 +203,8 @@ static void service_registration_result(int result, void 
*user_data)
 
        if (result == 0) {
                service->registered = true;
+               if (service->master)
+                       peer_master++;
                return;
        }
 
@@ -247,7 +255,8 @@ int __connman_peer_service_register(const char *owner, 
DBusMessage *msg,
                                        const unsigned char *specification,
                                        int specification_length,
                                        const unsigned char *query,
-                                       int query_length, int version)
+                                       int query_length, int version,
+                                       bool master)
 {
        struct _peer_service_owner *ps_owner;
        GBytes *spec, *query_spec = NULL;
@@ -306,6 +315,7 @@ int __connman_peer_service_register(const char *owner, 
DBusMessage *msg,
        service->specification = spec;
        service->query = query_spec;
        service->version = version;
+       service->master = master;
 
        g_hash_table_insert(services_map, spec, ps_owner);
        spec = query_spec = NULL;
@@ -315,8 +325,11 @@ int __connman_peer_service_register(const char *owner, 
DBusMessage *msg,
                goto error;
        else if (ret == -EINPROGRESS)
                service->pending = dbus_message_ref(msg);
-       else
+       else {
                service->registered = true;
+               if (master)
+                       peer_master++;
+       }
 
        ps_owner->services = g_list_prepend(ps_owner->services, service);
 
@@ -387,6 +400,8 @@ int __connman_peer_service_init(void)
                                                remove_peer_service_owner);
        services_map = g_hash_table_new_full(g_bytes_hash, g_bytes_equal,
                                                                NULL, NULL);
+       peer_master = 0;
+
        return 0;
 }
 
@@ -399,6 +414,7 @@ void __connman_peer_service_cleanup(void)
 
        g_hash_table_destroy(owners_map);
        g_hash_table_destroy(services_map);
+       peer_master = 0;
 
        dbus_connection_unref(connection);
        connection = NULL;
-- 
1.8.5.5

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

Reply via email to