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
[email protected]
https://lists.connman.net/mailman/listinfo/connman