summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hcid/adapter.c51
-rw-r--r--hcid/adapter.h2
-rw-r--r--hcid/dbus-common.c2
-rw-r--r--hcid/dbus-hci.c17
-rw-r--r--hcid/device.c72
-rw-r--r--hcid/device.h7
6 files changed, 47 insertions, 104 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c
index 4304388a..b589a721 100644
--- a/hcid/adapter.c
+++ b/hcid/adapter.c
@@ -3170,13 +3170,6 @@ static DBusHandlerResult adapter_list_trusts(DBusConnection *conn,
return send_message_and_unref(conn, reply);
}
-static void do_append_device(struct device *device, DBusMessageIter *iter)
-{
- const char *path = device->path;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
-}
-
static DBusHandlerResult get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -3298,7 +3291,9 @@ static DBusHandlerResult set_property(DBusConnection *conn,
static DBusHandlerResult list_devices(DBusConnection *conn,
DBusMessage *msg, void *data)
{
+ struct adapter *adapter = data;
DBusMessage *reply;
+ GSList *l;
DBusMessageIter iter;
DBusMessageIter array_iter;
@@ -3316,7 +3311,11 @@ static DBusHandlerResult list_devices(DBusConnection *conn,
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
- device_foreach((GFunc) do_append_device, &array_iter);
+ for (l = adapter->devices; l; l = l->next) {
+ struct device *device = l->data;
+ dbus_message_iter_append_basic(&array_iter,
+ DBUS_TYPE_OBJECT_PATH, &device->path);
+ }
dbus_message_iter_close_container(&iter, &array_iter);
@@ -3327,9 +3326,9 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)
{
sdp_list_t *seq, *next, *svcclass;
struct adapter *adapter = user_data;
+ struct device *device;
DBusMessage *reply;
GSList *uuids;
- const char *path;
bdaddr_t src, dst;
if (err < 0) {
@@ -3359,8 +3358,8 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)
sdp_list_free(recs, (sdp_free_func_t) sdp_record_free);
- path = device_create(adapter, adapter->create->address, uuids);
- if (!path)
+ device = device_create(adapter, adapter->create->address, uuids);
+ if (!device)
goto failed;
/* Reply create device request */
@@ -3368,7 +3367,7 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)
if (!reply)
goto failed;
- dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
+ dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &device->path,
DBUS_TYPE_INVALID);
send_message_and_unref(adapter->create->conn, reply);
@@ -3376,10 +3375,10 @@ static void discover_services_cb(gpointer user_data, sdp_list_t *recs, int err)
dbus_message_get_path(adapter->create->msg),
ADAPTER_INTERFACE,
"DeviceCreated",
- DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_OBJECT_PATH, &device->path,
DBUS_TYPE_INVALID);
- adapter->devices = g_slist_append(adapter->devices, g_strdup(path));
+ adapter->devices = g_slist_append(adapter->devices, device);
/* Store the device's profiles in the filesystem */
str2ba(adapter->address, &src);
@@ -3398,6 +3397,11 @@ failed:
adapter->create = NULL;
}
+static gint device_address_cmp(struct device *device, const gchar *address)
+{
+ return strcasecmp(device->address, address);
+}
+
static DBusHandlerResult create_device(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -3420,7 +3424,8 @@ static DBusHandlerResult create_device(DBusConnection *conn,
if (check_address(address) < 0)
return error_invalid_arguments(conn, msg, NULL);
- if (device_find(address))
+ if (g_slist_find_custom(adapter->devices,
+ address, (GCompareFunc) device_address_cmp))
return error_already_exists(conn, msg, "Device already exists");
str2ba(adapter->address, &src);
@@ -3441,10 +3446,16 @@ static DBusHandlerResult create_device(DBusConnection *conn,
return DBUS_HANDLER_RESULT_HANDLED;
}
+static gint device_path_cmp(struct device *device, const gchar *path)
+{
+ return strcasecmp(device->path, path);
+}
+
static DBusHandlerResult remove_device(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct adapter *adapter = data;
+ struct device *device;
DBusMessage *reply;
const char *path;
GSList *l;
@@ -3456,10 +3467,13 @@ static DBusHandlerResult remove_device(DBusConnection *conn,
DBUS_TYPE_INVALID) == FALSE)
return error_invalid_arguments(conn, msg, NULL);
- l = g_slist_find_custom(adapter->devices, path, (GCompareFunc) strcmp);
+ l = g_slist_find_custom(adapter->devices,
+ path, (GCompareFunc) device_path_cmp);
if (!l)
return error_device_does_not_exist(conn, msg);
+ device = l->data;
+
reply = dbus_message_new_method_return(msg);
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
@@ -3467,9 +3481,8 @@ static DBusHandlerResult remove_device(DBusConnection *conn,
/* FIXME: Remove from filesystem */
/* FIXME: Remove linkkeys */
- device_remove(path);
- g_free(l->data);
- adapter->devices = g_slist_remove(adapter->devices, l->data);
+ device_destroy(device);
+ adapter->devices = g_slist_remove(adapter->devices, device);
return send_message_and_unref(conn, reply);
}
diff --git a/hcid/adapter.h b/hcid/adapter.h
index c9ceea0f..9353fcdd 100644
--- a/hcid/adapter.h
+++ b/hcid/adapter.h
@@ -113,7 +113,7 @@ struct adapter {
GSList *pin_reqs;
struct pending_dc_info *pending_dc;
struct create_device_req *create;
- GSList *devices; /* Devices paths */
+ GSList *devices; /* Devices structure pointers */
};
dbus_bool_t adapter_init(DBusConnection *conn, const char *path);
diff --git a/hcid/dbus-common.c b/hcid/dbus-common.c
index 31a9c0c7..166d7184 100644
--- a/hcid/dbus-common.c
+++ b/hcid/dbus-common.c
@@ -306,8 +306,6 @@ void hcid_dbus_exit(void)
release_default_auth_agent();
release_services(conn);
- device_cleanup();
-
/* Unregister all paths in Adapter path hierarchy */
if (!dbus_connection_list_registered(conn, BASE_PATH, &children))
goto done;
diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c
index 92aed10f..837d47af 100644
--- a/hcid/dbus-hci.c
+++ b/hcid/dbus-hci.c
@@ -451,7 +451,7 @@ int unregister_adapter_path(const char *path)
}
if (adapter->devices) {
- g_slist_foreach(adapter->devices, (GFunc) free, NULL);
+ g_slist_foreach(adapter->devices, (GFunc) device_destroy, NULL);
g_slist_free(adapter->devices);
}
@@ -575,11 +575,11 @@ static void create_stored_device(char *key, char *value, void *user_data)
{
struct adapter *adapter = user_data;
GSList *uuids = bt_string2list(value);
- const gchar *path;
+ struct device *device;
- path = device_create(adapter, key, uuids);
-
- adapter->devices = g_slist_append(adapter->devices, g_strdup(path));
+ device = device_create(adapter, key, uuids);
+ if (device)
+ adapter->devices = g_slist_append(adapter->devices, device);
}
static void register_devices(bdaddr_t *src, struct adapter *adapter)
@@ -783,13 +783,6 @@ int hcid_dbus_stop_device(uint16_t id)
adapter->active_conn = NULL;
}
- if (adapter->devices) {
- g_slist_foreach(adapter->devices, (GFunc) device_remove, NULL);
- g_slist_foreach(adapter->devices, (GFunc) free, NULL);
- g_slist_free(adapter->devices);
- adapter->devices = NULL;
- }
-
send_adapter_signal(connection, adapter->dev_id, "ModeChanged",
DBUS_TYPE_STRING, &mode,
DBUS_TYPE_INVALID);
diff --git a/hcid/device.c b/hcid/device.c
index 3f4e5ba4..5e129ab5 100644
--- a/hcid/device.c
+++ b/hcid/device.c
@@ -713,10 +713,9 @@ int get_encryption_key_size(uint16_t dev_id, const bdaddr_t *baddr)
static DBusConnection *connection = NULL;
-static GSList *device_list = NULL;
-
gboolean device_init(DBusConnection *conn)
{
+ /* FIXME: It's not necessary keep a connection reference */
connection = dbus_connection_ref(conn);
if (connection == NULL)
return FALSE;
@@ -724,45 +723,6 @@ gboolean device_init(DBusConnection *conn)
return TRUE;
}
-static void device_destroy(struct device *device)
-{
- debug("Removing device %s", device->path);
-
- dbus_connection_destroy_object_path(connection, device->path);
-}
-
-void device_cleanup(void)
-{
- if (connection == NULL)
- return;
-
- g_slist_foreach(device_list, (GFunc) device_destroy, NULL);
- g_slist_free(device_list);
-
- dbus_connection_unref(connection);
-}
-
-void device_foreach(GFunc func, gpointer user_data)
-{
- g_slist_foreach(device_list, func, user_data);
-}
-
-struct device *device_find(const gchar *address)
-{
- GSList *l;
-
- if (!device_list || !address)
- return NULL;
-
- for (l = device_list; l; l = l->next) {
- struct device *device = l->data;
- if (strcmp(device->address, address) == 0)
- return device;
- }
-
- return NULL;
-}
-
static void device_free(struct device *device)
{
g_slist_foreach(device->uuids, (GFunc) g_free, NULL);
@@ -774,11 +734,7 @@ static void device_free(struct device *device)
static void device_unregister(DBusConnection *conn, void *user_data)
{
- struct device *device = user_data;
-
- device_list = g_slist_remove(device_list, device);
-
- device_free(device);
+ device_free(user_data);
}
static DBusHandlerResult disconnect(DBusConnection *conn,
@@ -901,7 +857,7 @@ static DBusSignalVTable device_signals[] = {
{ NULL, NULL }
};
-const gchar *device_create(struct adapter *adapter,
+struct device *device_create(struct adapter *adapter,
const gchar *address, GSList *uuids)
{
struct device *device;
@@ -925,30 +881,16 @@ const gchar *device_create(struct adapter *adapter,
dbus_connection_register_interface(connection, device->path,
DEVICE_INTERFACE, device_methods, device_signals, NULL);
- device_list = g_slist_append(device_list, device);
-
device->address = g_strdup(address);
device->adapter = adapter;
device->uuids = uuids;
- return device->path;
+ return device;
}
-static gint device_path_cmp(const struct device *device, const char *path)
+void device_destroy(struct device *device)
{
- return strcmp(device->path, path);
-}
+ debug("Removing device %s", device->path);
-void device_remove(const gchar *path)
-{
- GSList *l;
-
- l = g_slist_find_custom(device_list, path,
- (GCompareFunc) device_path_cmp);
- if (!l)
- return;
-
- dbus_connection_destroy_object_path(connection, path);
-
- device_list = g_slist_remove(device_list, l->data);
+ dbus_connection_destroy_object_path(connection, device->path);
}
diff --git a/hcid/device.h b/hcid/device.h
index 50795ba6..dc55f0a8 100644
--- a/hcid/device.h
+++ b/hcid/device.h
@@ -30,9 +30,6 @@ struct device {
};
gboolean device_init(DBusConnection *conn);
-void device_cleanup(void);
-void device_foreach(GFunc func, gpointer user_data);
-struct device *device_find(const gchar *address);
-const gchar *device_create(struct adapter *adapter,
+struct device *device_create(struct adapter *adapter,
const gchar *address, GSList *uuids);
-void device_remove(const gchar *path);
+void device_destroy(struct device *device);