diff options
Diffstat (limited to 'hcid/device.c')
| -rw-r--r-- | hcid/device.c | 32 | 
1 files changed, 24 insertions, 8 deletions
| diff --git a/hcid/device.c b/hcid/device.c index cfbab920..f83801a4 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -68,12 +68,17 @@  #define DEVICE_INTERFACE "org.bluez.Device" +static struct btd_driver_data { +	struct btd_device_driver *driver; +	void *priv; +}; +  struct btd_device {  	gchar		*address;  	gchar		*path;  	struct adapter	*adapter;  	GSList		*uuids; -	GSList		*drivers; +	GSList		*drivers;		/* List of driver_data */  	gboolean	temporary;  	struct agent	*agent;  	guint		disconn_timer; @@ -557,9 +562,11 @@ void device_remove(DBusConnection *conn, struct btd_device *device)  	debug("Removing device %s", path);  	for (list = device->drivers; list; list = list->next) { -		driver = (struct btd_device_driver *) list->data; +		struct btd_driver_data *driver_data = list->data; +		driver = driver_data->driver; -		driver->remove(device); +		driver->remove(driver, device); +		g_free(driver_data);  	}  	g_dbus_unregister_interface(conn, path, DEVICE_INTERFACE); @@ -623,15 +630,20 @@ void device_probe_drivers(struct btd_device *device, GSList *uuids, sdp_list_t *  		}  		if (records) { -			err = driver->probe(device, records); +			struct btd_driver_data *driver_data = g_new0(struct btd_driver_data, 1); + +			err = driver->probe(driver, device, records);  			if (err < 0) {  				error("probe failed for driver %s",  							driver->name); + +				g_free(driver_data);  				continue;  			} +			driver_data->driver = driver;  			device->drivers = g_slist_append(device->drivers, -								driver); +								driver_data);  		}  	} @@ -650,7 +662,8 @@ void device_remove_drivers(struct btd_device *device, GSList *uuids, sdp_list_t  	debug("Remove drivers for %s", device->path);  	for (list = device->drivers; list; list = list->next) { -		struct btd_device_driver *driver = list->data; +		struct btd_driver_data *driver_data = list->data; +		struct btd_device_driver *driver = driver_data->driver;  		const char **uuid;  		for (uuid = driver->uuids; *uuid; uuid++) { @@ -660,9 +673,12 @@ void device_remove_drivers(struct btd_device *device, GSList *uuids, sdp_list_t  			if (!match)  				continue; -			driver->remove(device); +			driver->remove(driver, device);  			device->drivers = g_slist_remove(device->drivers, -								driver); +								driver_data); + +			g_free(driver_data); +  			sdp_record_t *rec = get_record(recs, *uuid);  			delete_record(src, dst, rec->handle);  		} | 
