summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-02-24 18:40:27 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-02-24 18:40:27 +0000
commit12100721445e1651a5b8d58f4b5c8190de8d517e (patch)
tree5bbd8679e84694b51c619c74c061e66262ef01d6
parentd2bc437c04a2048856ba3edc54b9553bfdbd6e55 (diff)
Store the minor class changes
-rw-r--r--hcid/dbus-device.c9
-rw-r--r--hcid/hcid.h2
-rw-r--r--hcid/storage.c30
3 files changed, 41 insertions, 0 deletions
diff --git a/hcid/dbus-device.c b/hcid/dbus-device.c
index a9313505..d44c1cfc 100644
--- a/hcid/dbus-device.c
+++ b/hcid/dbus-device.c
@@ -486,6 +486,7 @@ static DBusMessage *handle_dev_set_minor_class_req(DBusMessage *msg, void *data)
DBusConnection *connection = get_dbus_connection();
DBusMessageIter iter;
DBusMessage *reply, *signal;
+ bdaddr_t bdaddr;
const char *minor;
uint8_t cls[3];
uint32_t dev_class = 0xFFFFFFFF;
@@ -524,6 +525,14 @@ static DBusMessage *handle_dev_set_minor_class_req(DBusMessage *msg, void *data)
dev_class |= (cls[2] << 16) | (cls[1] << 8);
+ cls[2] = 0x00; /* no service classes */
+ cls[1] = 0x01; /* major class computer */
+ cls[0] = (dev_class & 0xff);
+
+ hci_devba(dbus_data->dev_id, &bdaddr);
+
+ write_local_class(&bdaddr, cls);
+
if (hci_write_class_of_dev(dd, dev_class, 2000) < 0) {
syslog(LOG_ERR, "Can't write class of device on hci%d: %s(%d)",
dbus_data->dev_id, strerror(errno), errno);
diff --git a/hcid/hcid.h b/hcid/hcid.h
index ac1a33fc..c6516f9f 100644
--- a/hcid/hcid.h
+++ b/hcid/hcid.h
@@ -160,6 +160,8 @@ int get_encryption_key_size(uint16_t dev_id, const bdaddr_t *baddr);
int write_local_name(bdaddr_t *bdaddr, char *name);
int read_local_name(bdaddr_t *bdaddr, char *name);
+int write_local_class(bdaddr_t *bdaddr, uint8_t *class);
+int read_local_class(bdaddr_t *bdaddr, uint8_t *class);
int write_device_name(bdaddr_t *local, bdaddr_t *peer, char *name);
int read_device_name(bdaddr_t *local, bdaddr_t *peer, char *name);
int write_version_info(bdaddr_t *local, bdaddr_t *peer, uint16_t manufacturer, uint8_t lmp_ver, uint16_t lmp_subver);
diff --git a/hcid/storage.c b/hcid/storage.c
index 48b040cf..0fae9447 100644
--- a/hcid/storage.c
+++ b/hcid/storage.c
@@ -85,6 +85,36 @@ int read_local_name(bdaddr_t *bdaddr, char *name)
return 0;
}
+int write_local_class(bdaddr_t *bdaddr, uint8_t *class)
+{
+ char filename[PATH_MAX + 1], addr[18], str[9];
+
+ sprintf(str, "0x%2.2x%2.2x%2.2x", class[2], class[1], class[0]);
+
+ ba2str(bdaddr, addr);
+ snprintf(filename, PATH_MAX, "%s/%s/config", STORAGEDIR, addr);
+
+ create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+ return textfile_put(filename, "class", str);
+}
+
+int read_local_class(bdaddr_t *bdaddr, uint8_t *class)
+{
+ char filename[PATH_MAX + 1], addr[18], *str;
+
+ ba2str(bdaddr, addr);
+ snprintf(filename, PATH_MAX, "%s/%s/config", STORAGEDIR, addr);
+
+ str = textfile_get(filename, "class");
+ if (!str)
+ return -ENOENT;
+
+ free(str);
+
+ return 0;
+}
+
int write_device_name(bdaddr_t *local, bdaddr_t *peer, char *name)
{
char filename[PATH_MAX + 1], addr[18], str[249];