[PATCH v3 2/3] Add RemoveKnownService to connman

Roman Smrž <[email protected]> Thu, 26 Jun 2025 09:27:45 +0200
Newsgroups dev.linux.lists.connman
Message-ID <[email protected]>
From: Michael Trimarchi <[email protected]>

Add a way to remove stored network in connman storage. This
allow to remove network even if they are not visible
---
 src/connman.h        |  3 +++
 src/manager.c        | 21 +++++++++++++++++++++
 src/service.c        | 25 +++++++++++++++++++++++++
 tools/manager-api.c  | 43 +++++++++++++++++++++++++++++++++++++++++++
 tools/session-test.h |  2 ++
 5 files changed, 94 insertions(+)

diff --git a/src/connman.h b/src/connman.h
index a4e7e4f1..1f90c9b1 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -790,6 +790,8 @@ int __connman_service_disconnect(struct connman_service *service);
 void __connman_service_set_active_session(bool enable, GSList *list);
 void __connman_service_auto_connect(enum connman_service_connect_reason reason);
 bool __connman_service_remove(struct connman_service *service);
+bool __connman_service_remove_known_service(DBusConnection *conn,
+					    DBusMessage *msg, const char *path);
 void __connman_service_set_hidden_data(struct connman_service *service,
 				gpointer user_data);
 void __connman_service_return_error(struct connman_service *service,
@@ -847,6 +849,7 @@ void __connman_service_set_split_routing(struct connman_service *service,
 void __connman_service_split_routing_changed(struct connman_service *service);
 int __connman_service_get_index(const struct connman_service *service);
 void __connman_service_set_hidden(struct connman_service *service);
+void __connman_service_set_auto_connect(struct connman_service *service, bool autoconnect);
 void __connman_service_set_hostname(struct connman_service *service,
 						const char *hostname);
 const char *__connman_service_get_hostname(const struct connman_service *service);
diff --git a/src/manager.c b/src/manager.c
index b196109a..8c66ad3d 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -215,6 +215,24 @@ static DBusMessage *get_known_services(DBusConnection *conn,
 	return reply;
 }
 
+static DBusMessage *remove_known_service(DBusConnection *conn,
+				   DBusMessage *msg, void *data)
+{
+	const char *name;
+
+	DBG("conn %p", conn);
+
+	dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &name,
+							DBUS_TYPE_INVALID);
+
+	DBG("Service to remove [%s]", name);
+
+	if (!__connman_service_remove_known_service(conn, msg, name))
+		return __connman_error_failed(msg, -ENOENT);
+
+	return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
 static void append_peer_structs(DBusMessageIter *iter, void *user_data)
 {
 	__connman_peer_list_struct(iter);
@@ -557,6 +575,9 @@ static const GDBusMethodTable manager_methods[] = {
 	{ GDBUS_METHOD("GetKnownServices",
 			NULL, GDBUS_ARGS({"knownServices", "a(oa{sv})" }),
 			get_known_services) },
+	{ GDBUS_METHOD("RemoveKnownService",
+			GDBUS_ARGS({ "name", "o" }), NULL,
+			remove_known_service) },
 	{ GDBUS_METHOD("GetServices",
 			NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }),
 			get_services) },
diff --git a/src/service.c b/src/service.c
index bcda5076..88bbea3b 100644
--- a/src/service.c
+++ b/src/service.c
@@ -7530,6 +7530,31 @@ bool __connman_service_remove(struct connman_service *service)
 	return true;
 }
 
+bool __connman_service_remove_known_service(DBusConnection *conn,
+					    DBusMessage *msg, const char *path)
+{
+	struct connman_service *service;
+	const char* identifier;
+
+	DBG("Remove known service [%s]", path);
+
+	identifier = strrchr(path, '/');
+	if (!identifier)
+		return false;
+
+	service = g_hash_table_lookup(service_hash, identifier);
+
+	if (service) {
+		if (service->type != CONNMAN_SERVICE_TYPE_ETHERNET &&
+				service->type != CONNMAN_SERVICE_TYPE_GADGET) {
+			if (!__connman_service_remove(service))
+				return false;
+		}
+	}
+
+	return __connman_storage_remove_service(identifier);
+}
+
 static DBusMessage *remove_service(DBusConnection *conn,
 					DBusMessage *msg, void *user_data)
 {
diff --git a/tools/manager-api.c b/tools/manager-api.c
index 8668ca9e..376ff8dc 100644
--- a/tools/manager-api.c
+++ b/tools/manager-api.c
@@ -94,6 +94,49 @@ DBusMessage *manager_get_known_services(DBusConnection *connection)
 	return reply;
 }
 
+DBusMessage *manager_remove_known_service(DBusConnection *connection,
+					  const char *service_path)
+{
+	DBusMessage *message, *reply;
+	DBusError error;
+	DBusMessageIter array;
+
+	DBG("Service path to remove [%s]", service_path);
+
+	message = dbus_message_new_method_call(CONNMAN_SERVICE,
+				   CONNMAN_MANAGER_PATH,
+				   CONNMAN_MANAGER_INTERFACE,
+				   "RemoveKnownService");
+
+	if (!message)
+		return NULL;
+
+	dbus_error_init(&error);
+
+	dbus_message_iter_init_append(message, &array);
+
+	dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
+				&service_path);
+
+	reply = dbus_connection_send_with_reply_and_block(connection,
+				  message, -1, &error);
+
+	if (!reply) {
+		if (dbus_error_is_set(&error)) {
+			LOG("%s", error.message);
+			dbus_error_free(&error);
+		} else {
+			LOG("Failed to get known services");
+		}
+		dbus_message_unref(message);
+		return NULL;
+	}
+
+	dbus_message_unref(message);
+
+	return reply;
+}
+
 DBusMessage *manager_get_services(DBusConnection *connection)
 {
 	DBusMessage *message, *reply;
diff --git a/tools/session-test.h b/tools/session-test.h
index ab89f8c5..c19acb56 100644
--- a/tools/session-test.h
+++ b/tools/session-test.h
@@ -115,6 +115,8 @@ DBusMessage *session_disconnect(DBusConnection *connection,
 
 /* manager-api.c */
 DBusMessage *manager_get_known_services(DBusConnection *connection);
+DBusMessage *manager_remove_known_service(DBusConnection *connection,
+					  const char *service_path);
 DBusMessage *manager_get_services(DBusConnection *connection);
 DBusMessage *manager_get_properties(DBusConnection *connection);
 DBusMessage *manager_create_session(DBusConnection *connection,
-- 
2.49.0