diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-10-03 12:29:12 +0000 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-10-03 12:29:12 +0000 | 
| commit | 5cbd1e749e1fb45c2d36a46eae84106552c7ab50 (patch) | |
| tree | 3f8cd8a7b03b99688c3b8bb1f85941cc722985e0 | |
| parent | 09616172377cf146517c1eb821cb5f5d9cb2a188 (diff) | |
FindAdapter: don't ignore adapters in DOWN state
| -rw-r--r-- | hcid/manager.c | 53 | 
1 files changed, 52 insertions, 1 deletions
| diff --git a/hcid/manager.c b/hcid/manager.c index fa4e8eb1..418ccc09 100644 --- a/hcid/manager.c +++ b/hcid/manager.c @@ -25,6 +25,7 @@  #include <config.h>  #endif +#include <stdlib.h>  #include <stdio.h>  #include <errno.h>  #include <unistd.h> @@ -101,6 +102,50 @@ static DBusHandlerResult default_adapter(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } +static int find_by_address(const char *str) +{ +	struct hci_dev_list_req *dl; +	struct hci_dev_req *dr; +	bdaddr_t ba; +	int i, sk; +	int devid = -1; +	 +	sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); +	if (sk < 0) +		return -1; + +	dl = g_malloc0(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl)); + +	dl->dev_num = HCI_MAX_DEV; +	dr = dl->dev_req; + +	if (ioctl(sk, HCIGETDEVLIST, dl) < 0) +		goto out; + +	dr = dl->dev_req; +	str2ba(str, &ba); + +	for (i = 0; i < dl->dev_num; i++, dr++) { +		struct hci_dev_info di; + +		if (hci_devinfo(dr->dev_id, &di) < 0) +			continue; + +		if (hci_test_bit(HCI_RAW, &di.flags)) +			continue; + +		if (!bacmp(&ba, &di.bdaddr)) { +			devid = dr->dev_id; +			break; +		} +	} + +out: +	g_free(dl); +	close(sk); +	return devid; +} +  static DBusHandlerResult find_adapter(DBusConnection *conn,  						DBusMessage *msg, void *data)  { @@ -115,7 +160,13 @@ static DBusHandlerResult find_adapter(DBusConnection *conn,  				DBUS_TYPE_INVALID))  		return error_invalid_arguments(conn, msg); -	dev_id = hci_devid(pattern); +	/* hci_devid() would make sense to use here, except it +	   is restricted to devices which are up */ +	if (!strncmp(pattern, "hci", 3) && strlen(pattern) >= 4) +		dev_id = atoi(pattern + 3); +	else +		dev_id = find_by_address(pattern); +  	if (dev_id < 0)  		return error_no_such_adapter(conn, msg); | 
