Skip to contentSkip to conversation

FindAdapter ignores adapters which are in DOWN state

PATCH New Denis KENZIOR 1 participant 1 message Oct 2, 2007 Bluetooth drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 FindAdapter ignores adapters which are in DOWN state

Marcel,

The org.bluez.Manager.FindAdapter method is currently ignoring all adapters which are in DOWN state. We just noticed this when we tried using the offmode devdown hcid configure option. The ListAdapters returns all available adapters. Here's a patch that attempts to fix this.

-Denis

Index: manager.c
===================================================================
RCS file: /cvsroot/bluez/utils/hcid/manager.c,v
retrieving revision 1.6

manager.c +53 -1
diff -u -5 -r1.6 manager.c
@@ -99,10 +99,55 @@
 					DBUS_TYPE_INVALID);
 
 	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)
 {
 	DBusMessage *reply;
 	char path[MAX_PATH_LENGTH], *path_ptr = path;
@@ -113,11 +158,18 @@
 	if (!dbus_message_get_args(msg, NULL,
 				DBUS_TYPE_STRING, &pattern,
 				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);
 
 	if (hci_devinfo(dev_id, &di) < 0)
 		return error_no_such_adapter(conn, msg);

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel