[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