From 9b4bfa74d25e360932402994a32305bf2145eb34 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 30 Jul 2008 18:02:48 -0300 Subject: Fix adapter removal. --- src/adapter.c | 65 ++++++++++++++++++++++++++++++++++------------------------- src/adapter.h | 10 +++------ src/device.c | 11 ++++++---- src/manager.c | 18 +++-------------- 4 files changed, 51 insertions(+), 53 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index cb2eba0a..5cba591b 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1971,22 +1971,6 @@ static GDBusSignalTable adapter_signals[] = { { } }; -dbus_bool_t adapter_init(DBusConnection *conn, - const char *path, struct adapter *adapter) -{ - if (!connection) - connection = conn; - - return g_dbus_register_interface(conn, path, - ADAPTER_INTERFACE, adapter_methods, - adapter_signals, NULL, adapter, NULL); -} - -dbus_bool_t adapter_cleanup(DBusConnection *conn, const char *path) -{ - return g_dbus_unregister_interface(conn, path, ADAPTER_INTERFACE); -} - static inline uint8_t get_inquiry_mode(struct hci_dev *dev) { if (dev->features[6] & LMP_EXT_INQ) @@ -2540,11 +2524,24 @@ int adapter_update_ssp_mode(struct adapter *adapter, int dd, uint8_t mode) return 0; } -struct adapter *adapter_create(int id) +static void adapter_free(gpointer user_data) +{ + struct adapter *adapter = user_data; + + g_free(adapter->path); + g_free(adapter); + + return; +} + +struct adapter *adapter_create(DBusConnection *conn, int id) { char path[MAX_PATH_LENGTH]; struct adapter *adapter; + if (!connection) + connection = conn; + snprintf(path, sizeof(path), "/hci%d", id); adapter = g_try_new0(struct adapter, 1); @@ -2558,9 +2555,33 @@ struct adapter *adapter_create(int id) adapter->pdiscov_resolve_names = 1; adapter->path = g_strdup(path); + if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE, + adapter_methods, adapter_signals, NULL, + adapter, adapter_free)) { + error("Adapter interface init failed on path %s", path); + adapter_free(adapter); + return NULL; + } + return adapter; } +void adapter_remove(struct adapter *adapter) +{ + GSList *l; + char *path = g_strdup(adapter->path); + + debug("Removing adapter %s", path); + + for (l = adapter->devices; l; l = l->next) + device_remove(connection, l->data); + g_slist_free(adapter->devices); + + g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE); + + g_free(path); +} + uint16_t adapter_get_dev_id(struct adapter *adapter) { return adapter->dev_id; @@ -2582,16 +2603,6 @@ const gchar *adapter_get_address(struct adapter *adapter) return adapter->address; } -void adapter_free(struct adapter *adapter) -{ - if (!adapter) - return; - - g_free(adapter->path); - g_free(adapter); - - return; -} gboolean discov_timeout_handler(void *data) { struct adapter *adapter = data; diff --git a/src/adapter.h b/src/adapter.h index 27da5cfa..b8de61db 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -132,9 +132,6 @@ struct adapter { struct hci_dev dev; /* hci info */ }; -dbus_bool_t adapter_init(DBusConnection *conn, - const char *path, struct adapter *adapter); - int adapter_start(struct adapter *adapter); int adapter_stop(struct adapter *adapter); @@ -147,8 +144,6 @@ int adapter_set_class(struct adapter *adapter, uint8_t *cls); int adapter_update_ssp_mode(struct adapter *adapter, int dd, uint8_t mode); -dbus_bool_t adapter_cleanup(DBusConnection *conn, const char *path); - struct btd_device *adapter_get_device(DBusConnection *conn, struct adapter *adapter, const gchar *address); @@ -174,11 +169,12 @@ void adapter_remove_auth_request(struct adapter *adapter, bdaddr_t *dba); struct pending_auth_info *adapter_new_auth_request(struct adapter *adapter, bdaddr_t *dba, auth_type_t type); -struct adapter *adapter_create(int id); +struct adapter *adapter_create(DBusConnection *conn, int id); +void adapter_remove(struct adapter *adapter); uint16_t adapter_get_dev_id(struct adapter *adapter); const gchar *adapter_get_path(struct adapter *adapter); const gchar *adapter_get_address(struct adapter *adapter); -void adapter_free(struct adapter *adapter); +void adapter_remove(struct adapter *adapter); void adapter_set_discov_timeout(struct adapter *adapter, guint interval); void adapter_remove_discov_timeout(struct adapter *adapter); void adapter_set_scan_mode(struct adapter *adapter, uint8_t scan_mode); diff --git a/src/device.c b/src/device.c index 45137d65..99bfdd4c 100644 --- a/src/device.c +++ b/src/device.c @@ -682,10 +682,10 @@ void device_remove_drivers(struct btd_device *device, GSList *uuids, sdp_list_t const char **uuid; for (uuid = driver->uuids; *uuid; uuid++) { - GSList *match = g_slist_find_custom(uuids, *uuid, - (GCompareFunc) strcasecmp); + sdp_record_t *rec; - if (!match) + if (!g_slist_find_custom(uuids, *uuid, + (GCompareFunc) strcasecmp)) continue; driver->remove(driver, device); @@ -694,7 +694,10 @@ void device_remove_drivers(struct btd_device *device, GSList *uuids, sdp_list_t g_free(driver_data); - sdp_record_t *rec = get_record(recs, *uuid); + rec = get_record(recs, *uuid); + if (!rec) + continue; + delete_record(src, dst, rec->handle); } } diff --git a/src/manager.c b/src/manager.c index 4f638566..cda45f4c 100644 --- a/src/manager.c +++ b/src/manager.c @@ -442,20 +442,14 @@ static void manager_remove_adapter(struct adapter *adapter) int manager_register_adapter(int id) { - struct adapter *adapter = adapter_create(id); + struct adapter *adapter = adapter_create(connection, id); const gchar *path; - if(!adapter) + if (!adapter) return -1; path = adapter_get_path(adapter); - if (!adapter_init(connection, path, adapter)) { - error("Adapter interface init failed on path %s", path); - adapter_free(adapter); - return -1; - } - __probe_servers(path); manager_add_adapter(adapter); @@ -482,13 +476,7 @@ int manager_unregister_adapter(int id) manager_remove_adapter(adapter); - if (!adapter_cleanup(connection, path)) { - error("Failed to unregister adapter interface on %s object", - path); - return -1; - } - - adapter_free(adapter); + adapter_remove(adapter); return 0; } -- cgit