summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@indt.org.br>2008-07-30 18:02:48 -0300
committerLuiz Augusto von Dentz <luiz.dentz@indt.org.br>2008-07-30 18:02:48 -0300
commit9b4bfa74d25e360932402994a32305bf2145eb34 (patch)
tree4d6da404e60941b2aa83ab4a99258537b41998e1
parentd0c561820ca05cafc8a7d20e3250953b48aa5214 (diff)
Fix adapter removal.
-rw-r--r--src/adapter.c65
-rw-r--r--src/adapter.h10
-rw-r--r--src/device.c11
-rw-r--r--src/manager.c18
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;
}