diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2008-06-08 20:38:09 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2008-06-08 20:38:09 +0000 |
commit | 6061f1a889c90d4d408ca12b63b2db6235c73bae (patch) | |
tree | cdce17f5c8f056c3581a14801652fa718fcf8134 /hcid/device.c | |
parent | 19363c93557f8163f6f0a7ef0fe17c1eb73c5c96 (diff) |
Keep track of attached drivers
Diffstat (limited to 'hcid/device.c')
-rw-r--r-- | hcid/device.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/hcid/device.c b/hcid/device.c index fee2a4e8..7213cbf2 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -1090,10 +1090,18 @@ struct device *device_create(DBusConnection *conn, struct adapter *adapter, void device_remove(DBusConnection *conn, struct device *device) { + GSList *list; + struct btd_device_driver *driver; gchar *path = g_strdup(device->path); debug("Removing device %s", path); + for (list = device->drivers; list; list = list->next) { + driver = (struct btd_device_driver *) list->data; + + driver->remove(device->path); + } + g_dbus_unregister_interface(conn, path, DEVICE_INTERFACE); g_free(path); @@ -1106,31 +1114,36 @@ gint device_address_cmp(struct device *device, const gchar *address) static void probe_matching_drivers(struct device *device) { - GSList *drv_list; - const char **drv_uuid; + GSList *list; + const char **uuid; struct btd_device_driver *driver; int err; debug("Probe drivers for %s", device->path); - for (drv_list = drivers; drv_list; drv_list = drv_list->next) { - driver = (struct btd_device_driver *) drv_list->data; + for (list = drivers; list; list = list->next) { + driver = (struct btd_device_driver *) list->data; gboolean do_probe = FALSE; - for (drv_uuid = driver->uuids; *drv_uuid; drv_uuid++) { + for (uuid = driver->uuids; *uuid; uuid++) { GSList *match = g_slist_find_custom(device->uuids, - *drv_uuid, (GCompareFunc) strcasecmp); + *uuid, (GCompareFunc) strcasecmp); if (match) { do_probe = TRUE; break; } } - if (do_probe == TRUE) { + if (do_probe == TRUE && !g_slist_find_custom(device->drivers, + driver->name, (GCompareFunc) strcmp)) { + err = driver->probe(device->path); if (err < 0) error("probe failed for driver %s", driver->name); + else + device->drivers = g_slist_append(device->drivers, + driver); } } } |