diff options
| -rw-r--r-- | src/adapter.c | 65 | ||||
| -rw-r--r-- | src/adapter.h | 10 | ||||
| -rw-r--r-- | src/device.c | 11 | ||||
| -rw-r--r-- | src/manager.c | 18 | 
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;  }  | 
