diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2014-04-02 14:03:12 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2014-04-02 14:06:53 +0300 |
commit | 8dec0f65b4b2c29729959feabc053c38e6922efc (patch) | |
tree | cfa09d5e0b95939475f47c6a2ba54252f9ae1ff4 /btio | |
parent | 56f443387e0201b7e46474d863d1cc91b6d74ecb (diff) | |
download | bluez-8dec0f65b4b2c29729959feabc053c38e6922efc.tar.gz |
btio: Do RFCOMM peer address lookup only when really necessary
Diffstat (limited to 'btio')
-rw-r--r-- | btio/btio.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/btio/btio.c b/btio/btio.c index 6e73180fa..7cacaf054 100644 --- a/btio/btio.c +++ b/btio/btio.c @@ -1196,13 +1196,13 @@ static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1, { BtIOOption opt = opt1; struct sockaddr_rc src, dst; + gboolean have_dst = FALSE; int flags; socklen_t len; uint8_t dev_class[3]; uint16_t handle; - if (!get_peers(sock, (struct sockaddr *) &src, - (struct sockaddr *) &dst, sizeof(src), err)) + if (!get_src(sock, &src, sizeof(src), err)) return FALSE; while (opt != BT_IO_OPT_INVALID) { @@ -1214,9 +1214,19 @@ static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1, bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr); break; case BT_IO_OPT_DEST: + if (!have_dst) + have_dst = get_dst(sock, &dst, sizeof(dst), + err); + if (!have_dst) + return FALSE; ba2str(&dst.rc_bdaddr, va_arg(args, char *)); break; case BT_IO_OPT_DEST_BDADDR: + if (!have_dst) + have_dst = get_dst(sock, &dst, sizeof(dst), + err); + if (!have_dst) + return FALSE; bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr); break; case BT_IO_OPT_DEFER_TIMEOUT: @@ -1234,13 +1244,29 @@ static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1, return FALSE; break; case BT_IO_OPT_CHANNEL: - *(va_arg(args, uint8_t *)) = src.rc_channel ? - src.rc_channel : dst.rc_channel; + if (src.rc_channel) { + *(va_arg(args, uint8_t *)) = src.rc_channel; + break; + } + + if (!have_dst) + have_dst = get_dst(sock, &dst, sizeof(dst), + err); + if (!have_dst) + return FALSE; + + *(va_arg(args, uint8_t *)) = dst.rc_channel; break; case BT_IO_OPT_SOURCE_CHANNEL: *(va_arg(args, uint8_t *)) = src.rc_channel; break; case BT_IO_OPT_DEST_CHANNEL: + if (!have_dst) + have_dst = get_dst(sock, &dst, sizeof(dst), + err); + if (!have_dst) + return FALSE; + *(va_arg(args, uint8_t *)) = dst.rc_channel; break; case BT_IO_OPT_MASTER: |