diff options
author | Luiz Augusto von Dentz <luiz.dentz@indt.org.br> | 2008-07-30 18:02:48 -0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.dentz@indt.org.br> | 2008-07-30 18:02:48 -0300 |
commit | 9b4bfa74d25e360932402994a32305bf2145eb34 (patch) | |
tree | 4d6da404e60941b2aa83ab4a99258537b41998e1 /src/adapter.c | |
parent | d0c561820ca05cafc8a7d20e3250953b48aa5214 (diff) |
Fix adapter removal.
Diffstat (limited to 'src/adapter.c')
-rw-r--r-- | src/adapter.c | 65 |
1 files changed, 38 insertions, 27 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; |