diff --git a/btio/btio.c b/btio/btio.c index a45a9cc3..77ddb1df 100644 --- a/btio/btio.c +++ b/btio/btio.c @@ -511,6 +511,21 @@ static int set_priority(int sock, uint32_t prio) return 0; } +static gboolean get_key_size(int sock, int *size, GError **err) +{ + struct bt_security sec; + socklen_t len; + + memset(&sec, 0, sizeof(sec)); + len = sizeof(sec); + if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) { + *size = sec.key_size; + return TRUE; + } + + return FALSE; +} + static gboolean l2cap_set(int sock, int sec_level, uint16_t imtu, uint16_t omtu, uint8_t mode, int master, int flushable, uint32_t priority, GError **err) @@ -875,6 +890,10 @@ static gboolean l2cap_get(int sock, GError **err, BtIOOption opt1, va_arg(args, int *), err)) return FALSE; break; + case BT_IO_OPT_KEY_SIZE: + if (!get_key_size(sock, va_arg(args, int *), err)) + return FALSE; + break; case BT_IO_OPT_PSM: *(va_arg(args, uint16_t *)) = src.l2_psm ? btohs(src.l2_psm) : btohs(dst.l2_psm); diff --git a/btio/btio.h b/btio/btio.h index ae55b618..7e3e130e 100644 --- a/btio/btio.h +++ b/btio/btio.h @@ -52,6 +52,7 @@ typedef enum { BT_IO_OPT_DEST_BDADDR, BT_IO_OPT_DEFER_TIMEOUT, BT_IO_OPT_SEC_LEVEL, + BT_IO_OPT_KEY_SIZE, BT_IO_OPT_CHANNEL, BT_IO_OPT_SOURCE_CHANNEL, BT_IO_OPT_DEST_CHANNEL,