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