diff options
Diffstat (limited to 'hcid/storage.c')
| -rw-r--r-- | hcid/storage.c | 64 | 
1 files changed, 64 insertions, 0 deletions
| diff --git a/hcid/storage.c b/hcid/storage.c index ade97641..f321ab35 100644 --- a/hcid/storage.c +++ b/hcid/storage.c @@ -267,6 +267,70 @@ int read_device_name(bdaddr_t *local, bdaddr_t *peer, char *name)  	return 0;  } +int write_l2cap_info(bdaddr_t *local, bdaddr_t *peer, +			uint16_t mtu_result, uint16_t mtu, +			uint16_t mask_result, uint32_t mask) +{ +	char filename[PATH_MAX + 1], addr[18], str[18]; + +	if (mask_result) +		snprintf(str, sizeof(str), "%d -1", mtu_result ? -1 : mtu); +	else +		snprintf(str, sizeof(str), "%d 0x%08x", mtu_result ? -1 : mtu, mask); + +	create_filename(filename, PATH_MAX, local, "l2cap"); + +	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + +	ba2str(peer, addr); +	return textfile_put(filename, addr, str); +} + +int read_l2cap_info(bdaddr_t *local, bdaddr_t *peer, +			uint16_t *mtu_result, uint16_t *mtu, +			uint16_t *mask_result, uint32_t *mask) +{ +	char filename[PATH_MAX + 1], addr[18], *str, *space, *msk; + +	create_filename(filename, PATH_MAX, local, "l2cap"); + +	ba2str(peer, addr); +	str = textfile_get(filename, addr); +	if (!str) +		return -ENOENT; + +	space = strchr(str, ' '); +	if (!space) { +		free(str); +		return -ENOENT; +	} + +	msk = space + 1; +	*space = '\0'; + +	if (mtu_result && mtu) { +		if (str[0] == '-') +			*mtu_result = 0x0001; +		else { +			*mtu_result = 0; +			*mtu = (uint16_t) strtol(str, NULL, 0); +		} +	} + +	if (mask_result && mask) { +		if (msk[0] == '-') +			*mask_result = 0x0001; +		else { +			*mask_result = 0; +			*mask = (uint32_t) strtol(msk, NULL, 16); +		} +	} + +	free(str); + +	return 0; +} +  int write_version_info(bdaddr_t *local, bdaddr_t *peer, uint16_t manufacturer, uint8_t lmp_ver, uint16_t lmp_subver)  {  	char filename[PATH_MAX + 1], addr[18], str[16]; | 
