diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-12-22 19:33:41 -0300 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-12-22 11:36:21 +0200 | 
| commit | ad37d886cc54a9a975f0f5322165bbb2855dac7f (patch) | |
| tree | 7958db7c3960c9ab35a4a886cc3fc92335ec9d1b /src/adapter.c | |
| parent | 2310cdaf70c36422a95c0b1832decf86deb894bf (diff) | |
Cleanup adapters on exit.
When bluetoothd is terminated any remaining registered adapters should
be unregistered (including proper D-Bus signal emition) and have their
drivers removed. The adapters should also be brought down unless they
were already up upon initialization.
Diffstat (limited to 'src/adapter.c')
| -rw-r--r-- | src/adapter.c | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/src/adapter.c b/src/adapter.c index 5eaf729a..dc6f8e9c 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -120,6 +120,7 @@ struct btd_adapter {  	gboolean pairable;		/* pairable state */  	gboolean initialized; +	gboolean already_up;		/* adapter was already up on init */  };  static void adapter_set_pairable_timeout(struct btd_adapter *adapter, @@ -2912,7 +2913,8 @@ static void adapter_free(gpointer user_data)  	return;  } -struct btd_adapter *adapter_create(DBusConnection *conn, int id) +struct btd_adapter *adapter_create(DBusConnection *conn, int id, +				gboolean devup)  {  	char path[MAX_PATH_LENGTH];  	struct btd_adapter *adapter; @@ -2933,6 +2935,7 @@ struct btd_adapter *adapter_create(DBusConnection *conn, int id)  	adapter->dev_id = id;  	adapter->state |= RESOLVE_NAME;  	adapter->path = g_strdup(path); +	adapter->already_up = devup;  	if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,  			adapter_methods, adapter_signals, NULL, @@ -2958,6 +2961,17 @@ void adapter_remove(struct btd_adapter *adapter)  		device_remove(connection, l->data);  	g_slist_free(adapter->devices); +	/* Return adapter to down state if it was not up on init */ +	if (adapter->up && !adapter->already_up) { +		int dd = hci_open_dev(adapter->dev_id); +		if (dd < 0) +			goto done; + +		ioctl(dd, HCIDEVDOWN, adapter->dev_id); +		hci_close_dev(dd); +	} + +done:  	g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);  	g_free(path);  | 
