diff options
| -rw-r--r-- | hcid/dbus-device.c | 9 | ||||
| -rw-r--r-- | hcid/hcid.h | 2 | ||||
| -rw-r--r-- | hcid/storage.c | 30 | 
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];  | 
