summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-09-28 14:09:48 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-09-28 14:09:48 +0000
commit568444a53269be5ea32310f1d8d29ceb78c11682 (patch)
treebf5727c464d9b711d7603c84dfd9208b7fe7068e
parentd08e9842e285824257307c13195ecd7e75ead480 (diff)
GetMajorClass: call hci_read_class_of_dev to check the major class
-rw-r--r--hcid/dbus-adapter.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index c8ecfae4..780e82cd 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -695,8 +695,11 @@ static DBusHandlerResult handle_dev_list_connections_req(DBusConnection *conn, D
static DBusHandlerResult handle_dev_get_major_class_req(DBusConnection *conn, DBusMessage *msg, void *data)
{
+ const struct hci_dbus_data *dbus_data = data;
DBusMessage *reply;
const char *str_ptr = "computer";
+ uint8_t cls[3];
+ int dd;
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
return error_invalid_arguments(conn, msg);
@@ -705,7 +708,24 @@ static DBusHandlerResult handle_dev_get_major_class_req(DBusConnection *conn, DB
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- /*FIXME: Check the real device major class */
+ dd = hci_open_dev(dbus_data->dev_id);
+ if (dd < 0)
+ return error_no_such_adapter(conn, msg);
+
+ if (hci_read_class_of_dev(dd, cls, 1000) < 0) {
+ int err = errno;
+ error("Can't read class of device on hci%d: %s(%d)",
+ dbus_data->dev_id, strerror(errno), errno);
+ hci_close_dev(dd);
+ return error_failed(conn, msg, err);
+ }
+
+ hci_close_dev(dd);
+
+ /* FIXME: Currently, only computer major class is supported */
+ if ((cls[1] & 0x1f) != 1)
+ return error_unsupported_major_class(conn, msg);
+
dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,
DBUS_TYPE_INVALID);